014-unittest扩展
unittest扩展
1. unittest框架里面---verbosity设置
这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值:
0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
并且 你在命令行里加入不同的参数可以起到一样的效果
加入 –quiet 参数 等效于 verbosity=0
加入–verbose参数等效于 verbosity=2
什么都不加就是 verbosity=1
2. Python 跳过前几行读取文件内容 itertools(islice)使用
参数:islice(文件名, 开始行, 结束行):
from itertools import islice input_file = open("test.csv") for line in islice(input_file, 1, None): do_readline()
3. python 文件读写时用open还是codecs.open
open打开文件只能写入str类型,不管字符串是什么编码方式,有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为unicode。此时写入open方式打开的文件就有问题了
>>> line2 = u'我爱祖国'
>>> fr.write(line2)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
fr.write(line2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
我们可以将上面的line2编码成str类型,但是太麻烦。我们要把得到的东西先decode为unicode再encode为str。。。代替这繁琐的操作就是codecs.open
>>> import codecs
>>> fw = codecs.open('test1.txt','a','utf-8')
>>> fw.write(line2)
4. 区别 utf-8 和utf-8-sig
”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 会发生错误.
"uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8", 因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.
发送邮件
5.
smtplib.SMTPDataError: (554, b'DT:SPM 126 smtp9
#报错原因是因为“发件人和收件人参数没有进行定义
解决方法:对发件人和收件人参数进行定义
msg['from'] = 'sender@126.com'
msg['to'] = 'receiver@163.com'
6.
AttributeError: module 'yagmail' has no attribute 'SMTP'
关于使用yagmail发邮件报错的解决方法:
用yagmail,发送自动化测试结果邮件,发现运行的时候报错。最后发现是自己的脚本名称用的yagmail.py,更改成另一个就好,换了my_yagmail.py
7.数据驱动
使用读取文件来实现参数化,这里以读取CSV文件为例
# 多条数据当作多个多条用例执行 import csv import codecs import unittest from time import sleep from itertools import islice from selenium import webdriver class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.base_url = "http://www.baidu.com" cls.test_data = [] with codecs.open("baidu_data.csv", "r", "utf_8_sig") as f: data = csv.reader(f) for line in islice(data, 1, None): cls.test_data.append(line) def baidu_search(self,search_key): self.driver.get(self.base_url) self.driver.find_element_by_id("kw").send_keys(search_key) self.driver.find_element_by_id("su").click() sleep(2) def test_search_selenium(self): self.baidu_search(self.test_data[0][1]) def test_search_unittest(self): self.baidu_search(self.test_data[1][1]) def test_search_parameterized(self): self.baidu_search(self.test_data[2][1]) @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == "__main__": unittest.main(verbosity=2)
8.使用邮件发送测试报告
import unittest import time import yagmail from HTMLTestRunner import HTMLTestRunner def send_mail(report): yag = yagmail.SMTP(user="sender@126.com", password="123456", host="smtp.126.com") subject = "自动化测试报告" contents = "请查看附件" yag.send("receiver@126.com", subject, contents, report) print("email has send out !") if __name__ == "__main__": # 定义测试用例的目录为当前目录 test_dir = "./test_case" suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py") # 获取当前日期和时间 now_time = time.strftime("%Y-%m-%d %H_%M_%S") html_report = "./test_report/" + now_time + "result.html" fp = open(html_report, "wb") # 调用HTMLTestRunner,运行测试用例 runner = HTMLTestRunner(stream=fp, title="测试报告", description="运行环境:Window 10,Chrome浏览器") runner.run(suit) fp.close() send_mail(html_report) # 发送报告