unittest组件TestCase 使用
unittest.TestCase
1.使用方法
在测试类中继承unittest.TestCase类即可
每写一个方法表示一个测试用例
import unittest
class Login(unittest.TestCase):
def test01(self):
print("执行test01。。。。。。")
def test02(self):
print("执行test02。。。。。。")
2.运行
2.1 在pycharm中运行
运行所有用例, 在class右键运行即可运行所有类
运行单个用例, 在需要运行的方法右键可运行单个用例
2.2 通过unittest.main()执行

unittest.main()参数说明:
module:测试用例所在的路径,__main__代表当前模块。
defaultTest:默认是所有测试用例
# 指定用例运行
unittest.main(defaultTest='Login.test_a01')
argv: 接收外部传递给程序的参数
testRunner: 测试运行器,默认文本运行器,输出文本测试报告
#默认文本运行器执行
unittest.main(testRunner=unittest.TestRunner)
#第三方库html运行器
from HTMLTestRunner import HTMLTestRunner
unittest.main(testRunner=HTMLTestRunner.HTMLTestRunner)
html运行结果:
可查看到输出的是html文本,这显然不是我们想要的结果

将测试报告以保存至html文件中
# 以只写方式打开测试报告文件
f = open("./test01.html", "wb")
# 实例化 HTMLTestRunner 对象 stream:open 函数打开的文件流; title:[可选参数],为报告标题; description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本;
unittest.main(testRunner=HTMLTestRunner(stream=f, title="自动化测试报告", description="Chrome 浏览器"))
f.close()
踩坑:
Traceback (most recent call last):
File "D:/Code/pythonProject/pdftoword/runnerTest.py", line 20, in <module>
runner.run(suite)
File "D:\MyWork\python38\lib\site-packages\HTMLTestRunner\HTMLTestRunner.py", line 631, in run
self.generateReport(test, result)
File "D:\MyWork\python38\lib\site-packages\HTMLTestRunner\HTMLTestRunner.py", line 691, in generateReport
self.stream.write(output)
TypeError: a bytes-like object is required, not 'str'
定位问题我们发现,输出测试报告,如果是打印控制台需要的是字符串,如果要输出文本那么是需要字节流
那么可以修改以下源码解决问题:
# HTMLTestRunner.py 690 - 691行
#修改前
# self.stream.write(output.encode('utf8'))
self.stream.write(output)
#修改后
self.stream.write(output) if "<stdout>" == self.stream.name else self.stream.write(output.encode('utf8'))
再次运行:
已经生成HTML测试报告


testLoader: 测试加载器
exit:是否在测试用例结束之后退出程序,默认True
verbosity:显示详细信息的程度。
0: 只显示用例总数以及全局执行结果1: 默认值,显示用例总数以及全局执行结果外,还显示一个标记:. F E,S>=2: 显示用例总数以及全局执行结果外,显示详解结果
failfast: 失败时是否终止测试
warnings: 是否显示警告信息
2.2 命令行运行
1.运行用例
python -m unittest {模块名|文件名}.{类名}
如:
python -m unittest runnerTest.Login
也可以在类名后面继续加上 .{方法名}
执行单个用例
2. 命令行参数说明
-v : unittest 后面加上 -v 表示输入详细运行结果
如:
python -m unittest -v runnerTest.Login
输出:

-k: 表示匹配用例执行
-k 匹配模式:
如:
-k *{匹配字符串} 以通配符的方式匹配用例执行
python -m unittest -v runnerTest.Login -k *02
-k {字符串} 包含字符串的用例会被执行
python -m unittest -v runnerTest.Login -k 02
执行结果:

2. 运行结果参数
. 代表成功。如果加了-v,那么.会变成OK. 更详细的结果, 下面相同
F代表用例执行失败。
E:出错。有异常抛出。
S:代表用例被跳过
3.运行顺序
根据ASCII的大小排序来执行测试用例。
如有以下两个用例:
import unittest
class Login(unittest.TestCase):
def test_a01(self):
print("执行test_a01。。。。。。")
def test_A01(self):
print("执行test_A01。。。。。。")
执行输出:
可以看到大写A先执行, 小写a后执行

打印大小写a的ASCII码:
可查看到大写A比小写a的 ASCII码小,所以用例test_A01会先执行

4. 用例过滤
使用unittest的装饰器修饰在用例或者类上进行过滤用例
1.@unittest.skip
skip:接收一个字符串参数,默认为空字符串'',描述用例不执行原因
@unittest.skip("此用例不执行")
def test_a01(self):
print("执行test_a01。。。。。。")
执行结果:

2.@unittest.skipIf
skipIf:接收两个参数
参数1: 接收一个条件表达式, 条件为True时用例不执行
参数2: 接收一个字符串参数, 描述用例不执行原因
@unittest.skipIf(1 == 1, "用例不执行")
def test_login2(self):
print("测试用例执行。。。。。")

2.@unittest.skipUnless
skipUnless:接收两个参数
参数1: 接收一个条件表达式, 条件为False时用例不执行
参数2: 接收一个字符串参数, 描述用例不执行原因
@unittest.skipUnless(1 == 2, "用例不执行")
def test_login2(self):
print("测试用例执行。。。。。")

5、断言
常见断言方式
self.assertEqual(a, b, msg="a与b相等时,断言成功")
self.assertNotEqual(a, b, msg="a与b不相等时,断言成功")
self.assertTrue(a == b, msg="接收一个表达式,表达式返回True, 断言成功")
self.assertFalse(a == b, msg="接收一个表达式,a == b返回False ,断言成功")
self.assertIn("a", ["a", "b"], msg="a 包含列表时,断言成功")
self.assertNotIn(5, [1, 2, 3], msg="5不包含在类别时,断言成功")

浙公网安备 33010602011771号