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文本,这显然不是我们想要的结果
image
将测试报告以保存至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测试报告
image
image

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

输出:
image

-k: 表示匹配用例执行
-k 匹配模式:

如:

-k *{匹配字符串} 以通配符的方式匹配用例执行
python -m unittest -v runnerTest.Login -k *02

-k {字符串} 包含字符串的用例会被执行
python -m unittest -v runnerTest.Login -k 02

执行结果:
image

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。。。。。。")

执行结果:
image

2.@unittest.skipIf

skipIf:接收两个参数
参数1: 接收一个条件表达式, 条件为True时用例不执行
参数2: 接收一个字符串参数, 描述用例不执行原因

    @unittest.skipIf(1 == 1, "用例不执行")
    def test_login2(self):
        print("测试用例执行。。。。。")

image

2.@unittest.skipUnless

skipUnless:接收两个参数
参数1: 接收一个条件表达式, 条件为False时用例不执行
参数2: 接收一个字符串参数, 描述用例不执行原因

    @unittest.skipUnless(1 == 2, "用例不执行")
    def test_login2(self):
        print("测试用例执行。。。。。")

image

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不包含在类别时,断言成功")
posted @ 2020-04-18 16:37  silence022  阅读(72)  评论(0)    收藏  举报