python之unittest测试框架

Posted 永远不要矫情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之unittest测试框架相关的知识,希望对你有一定的参考价值。

unittest:python的单元测试框架,类似于java的Junit。unittest有5个很重要的组件:test fixture,test case,test suite,test runner,test loader。

  • test case:一个TestCase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括测试前准备环境的搭建,执行测试代码,以及测试后环境的还原。
  • test suite:多个测试用例集合在一起便是TestSuite。
  • test runner:执行测试用例。执行TestSuite或TestCase的run方法
  • test loader:用来加载TestCase到TestSuite.
  • test fixture:对一个测试用例环境的搭建和销毁,通过覆盖TestCase的setUp()和tearDown()方法来实现。

1.unittest的方法

1.1 setup和teardown
方法分类:

  • 类方法:只执行一次
  • 实例方法:每次运行用例都执行
    执行顺序为:
    setUpClass->setUp->testA->tearDown->setUp->testB->tearDown->tearDownClass
    注意:用例之间按照用例名称ASCII码的顺序加载,数字与字母顺位为0-9,A-Z,a-z。在unittest中,实例方法必须以test开头
    例如:
#coding:utf-8
import unittest

class MyTestCase(unittest.TestCase): #继承unittest.TestCase类
    @classmethod
    def setUpClass(cls) -> None:
        print('运行一次:setUpClass')

    def setUp(self) -> None:
        print('每次都运行:setUp')


    def test1(self):
        print('test1')


    def test2(self):
        print('test2')

    def atest2(self):
        print('atest2')

    def tearDown(self) -> None:
        print('每次都运行:tearDown')
    @classmethod
    def tearDownClass(cls) -> None:
        print('运行一次:tearDownClass')


if __name__ == '__main__':
    unittest.main()

运行结果:

运行一次:setUpClass
每次都运行:setUp
test1
每次都运行:tearDown
每次都运行:setUp
test2
每次都运行:tearDown
运行一次:tearDownClass

1.2 断言方法
在这里插入图片描述
例如:在test2中断言self.assertLess(3, 2)失败后,都会运行完相关方法,控制台报错。

#coding:utf-8
import unittest

class MyTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('运行一次:setUpClass')

    def setUp(self) -> None:
        print('每次都运行:setUp')

    def test1(self):
        print('test1')
        self.assertEqual(1, 1)
        self.assertIn(1, [1, 2, 3])

    def test2(self):
        print('test2')
        self.assertLess(3, 2)
        self.assertGreater(2, 1)

    def tearDown(self) -> None:
        print('每次都运行:tearDown')
    @classmethod
    def tearDownClass(cls) -> None:
        print('运行一次:tearDownClass')


if __name__ == '__main__':
    unittest.main()

输出结果:

----------------------------------------------------------------------
Traceback (most recent call last):
  File "G:/PyProject/untitled/test1.py", line 21, in test2
    self.assertLess(3, 2)
AssertionError: 3 not less than 2

----------------------------------------------------------------------
Ran 2 tests in 0.013s

FAILED (failures=1)
运行一次:setUpClass
每次都运行:setUp
test1
每次都运行:tearDown
每次都运行:setUp
test2
每次都运行:tearDown
运行一次:tearDownClass

2.加载测试用例的方法

首先我们需要实例化两个对象:
suite=unittest.TestSuite()
loader=unittest.TestLoader()

加载测试用例的方法有四种:
方法一:通过测试用例类进行加载

suite.addTest(loader.loadTestsFromTestCase(MyTest1))
suite.addTest(loader.loadTestsFromTestCase(MyTest2))

方法二:通过测试用例模板进行加载

  suite.addTest(loader.loadTestsFromModule(MyTest1))
  suite.addTest(loader.loadTestsFromModule(MyTest2))

方法三:通过路径加载

 path = os.path.dirname(os.path.abspath(__file__))
 suite.addTest(loader.discover(path))

方法四:逐条加载测试用例,这种效率比较低,不建议使用

   case1 = MyTest1("test1")
   case2 = MyTest1("test2")
   
   suite.addTest(case1)
   suite.addTest(case2)

例如:

import unittest


class MyTest1(unittest.TestCase):
    def test1(self):
        print('test1')

    def test2(self):
        print('test2')


class MyTest2(unittest.TestCase):
    def test2(self):
        print('test2')


if __name__ == '__main__':
    # 实例化
    suite = unittest.TestSuite()
    loader = unittest.TestLoader()

    # 方法一: 通过测试用例类进行加载
    suite.addTest(loader.loadTestsFromTestCase(MyTest1))
    suite.addTest(loader.loadTestsFromTestCase(MyTest2))

    # 方法二: 通过测试用例模板去加载
    # suite.addTest(loader.loadTestsFromModule(MyTest1))
    # suite.addTest(loader.loadTestsFromModule(MyTest2))

    # 方法三:通过路径加载
    # import os
    # path = os.path.dirname(os.path.abspath(__file__))
    # suite.addTest(loader.discover(path))

    # 方法四:逐条加载测试用例 low

    # case1 = MyTest1("test1")
    # case2 = MyTest1("test2")
    #
    # suite.addTest(case1)
    # suite.addTest(case2)

    # 运行
    runner = unittest.TextTestRunner()
    runner.run(suite)

以上是关于python之unittest测试框架的主要内容,如果未能解决你的问题,请参考以下文章

Python接口测试之对MySQL/unittest框架/Requests 的操作

Python测试框架之unittest和pytest

python单元测试之unittest框架

Python单元测试框架unittest之深入学习

单元测试框架之unittest

Python3-unittest测试框架之测试用例类