随笔 - 111  文章 - 0 评论 - 2 阅读 - 16429
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5


unittest框架:
- 丰富的断言类型
- 自动化测试
- 测试报告

unittest框架的下载
在python3中unittest是内置模块

1.自定义的类必须继承TestCase,执行run函数,则会自动找以methodName指定的方法名并执行,默认名字为 runTest
复制代码
from unittest import TestCase
from case_set import CaseSet


class MineCase(TestCase):


    def runTest(self):
        code = CaseSet().get_status_code()
        self.assertEqual(code, 200, '实际值是:{},预期值是:{}'.format(code, 200))


if __name__ == '__main__':
    MineCase().run()
复制代码

 


2.每个用例在执行之前会执行setUp函数,在每个用例执行之后会执行tearDown函数
3.unittest中有很多断言可以用
-assertIn(a,b,msg):a如果不在b中报错
-assertIs(a, b, msg):a is not b报错
-assertEqual(a, b, msg): a不等于b报错
-assertNotEqual(a, b, msg): a等于b报错
-assertTrue(x, msg):表达式x为False,报错
-assertFalse(x, msg):表达式x为True,报错
- ...
4.unittest中执行脚本的另一种方式
- 在类中定义方法名以test为开头
- 执行unittest.main()
5. self._testMethodName:用例函数名 self._testMethodDoc:用力函数的描述注释

6. TestSuite:测试套件,可以理解为一个盒子,包含多个测试用例
使用步骤:
-实例化所有的用例
-创建一个盒子
-将用例放在盒子中
-使用执行器执行盒子中的用例
代码如下:

 

复制代码
class MineCase1(TestCase):
    def test_case_001(self):
        self.assertTrue("Foo".isupper())

    def test_case_002(self):
        self.assertTrue('foo'.islower())
if __name__ == '__main__':
    # 实例化用例
    case1 = MineCase1(methodName="test_case_001")
    case2 = MineCase1(methodName="test_case_002")
    # 创建容器
    suite = unittest.TestSuite()
    # 将用例放入容器中
    suite.addTests([case1, case2])
    # 使用执行器执行
    runner = unittest.TextTestRunner()
    runner.run(suite)
复制代码

 

7.makeSuite:在实例化suite的时候,同时完成收集用例
1
2
3
4
5
6
7
8
9
10
11
12
class MineCase1(TestCase):
    def test_case_001(self):
        self.assertTrue("Foo".isupper())
 
    def test_case_002(self):
        self.assertTrue('foo'.islower())
 
 
if __name__ == '__main__':
    suite = unittest.makeSuite(testCaseClass=MineCase1, prefix="test")
    runner = unittest.TextTestRunner()
    runner.run(suite)


8. suite = unittest.TestLoader().loadTestsFromModule(模块名字):发现一个模块中的所有继承TestCase且以test为开头的用例
suite = unittest.TestLoader().loadTestsFromTestCase(类名):发现指定类中中以test为开头的用例

9.suite = unittest.TestLoader().discover(start_dir='',
pattern='test*.py',
top_level_dir=None)
递归查找起始目录start_dir下,所有以test开头的模块中的继承TestCase且以test为开头的用例
注意:top_level_dir >= start_dir

10. verbosity:用来控制执行器用例输出详细程度
-0: 精简模式
-1:默认模式,输出用例执行结果
-2: 详细模式,输出用例来自哪个模块下以及执行结果 推荐
runner = unittest.TextTestRunner(verbosity=2)

11. setupClass & tearDownClass:在所有用例执行之前执行有且一次,在所有用例执行之后有且执行一次
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MineCase1(TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("用例执行之前,只执行一次")
 
    @classmethod
    def tearDownClass(cls) -> None:
        print("用例执行之后,只执行一次")
 
    def setUp(self) -> None:
        print("before用例执行之前")
 
    def tearDown(self) -> None:
        print("after用例执行之后")
 
    def test_case_001(self):
        self.assertTrue("FOO".isupper())
 
    def test_case_002(self):
        self.assertTrue('foo'.islower())
 
 
if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(MineCase1)
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)
    打印结果
用例执行之前,只执行一次
before用例执行之前
after用例执行之后
before用例执行之前
after用例执行之后
用例执行之后,只执行一次

12. 跳过用例
-unittest.skip(reason)
-unittest.skipif(condition,reason)
代码:
复制代码
class MineCase1(TestCase):
    @unittest.skip(reason="无条件跳过")
    def test_case_001(self):
        self.assertTrue("FOO".isupper())

    @unittest.skipIf(condition=10 > 2, reason="跳过")
    def test_case_002(self):
        self.assertTrue('foo'.islower())

    def test_case_003(self):
        self.assertTrue('foo'.islower())


if __name__ == '__main__':
    unittest.main(verbosity=2)
复制代码
13. 将执行结果放入文本中:创建执行器指定stream文件流    


代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MineCase1(TestCase):
    def test_case_001(self):
        self.assertTrue("FOO".isupper())
 
    def test_case_002(self):
        self.assertTrue('foo'.islower())
 
    def test_case_003(self):
        self.assertTrue('foo'.islower())
 
 
if __name__ == '__main__':
    suite = unittest.makeSuite(testCaseClass=MineCase1, prefix="test")
    with open('a.txt', "w", encoding="utf-8") as fd:
        runner = unittest.TextTestRunner(verbosity=2, stream=fd)
        runner.run(suite)

  


14. 生成测试报告:借助 HTMLTestRunner模块来实现

该 HTMLTestRunner为非官方,所以不能pip下载,文件代码,在项目中HTMLTestRunner.py中(适用于python3)
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from HTMLTestRunner import HTMLTestRunner
class MineCase1(TestCase):
    # @unittest.skip(reason="无条件跳过")
    def test_case_001(self):
        self.assertTrue("FOO".isupper())
 
    @unittest.skipIf(condition=10 < 2, reason="跳过")
    def test_case_002(self):
        self.assertTrue('foo'.islower())
 
    def test_case_003(self):
        self.assertTrue('foo'.islower())
 
if __name__ == '__main__':
 
    suite = unittest.makeSuite(testCaseClass=MineCase1, prefix="test")
    with open('a.html', "wb") as fd:
        runner = HTMLTestRunner(stream=fd, verbosity=2, title="自动化测试结果", description="ATA 测试结果")
        runner.run(suite)

 

 

1
HTMLTestRunner.py

15.addCleanup

  • addCleanup可在case执行过程的任何地方进行添加清理函数,比如setUp,tearDown或者case中;

  • 正常情况下不需要主动调用,每个case执行结束都会执行添加的清理函数,添加函数执行顺序(后进先出);
  • 哪个用例添加的,只会在该用例中调用清理函数,其他的用力不会调用
  • tearDown与addCleanup可以结合使用,两者并不冲突;相对来说addCleanup使用起来更加灵活,可以在用例运行中执行;

16.doCleanups

  • 它负责调用addCleanup() 添加的所有清除函数;
  • doCleanups() 一次将方法从清理函数的堆栈中弹出,因此可以随时调用它;
  • setUp() 引发异常的情况下无条件调用此方法;

17.addClassCleanup

  优先级在tearDownClass之后,也只会执行一次

18.doClassCleanups

执行之前添加所有添加的清理函数

posted on   阿明明  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示