python之unittest测试框架

本文详细介绍了Python的单元测试框架unittest,包括其核心组件如TestCase、TestSuite等的基本概念及使用方法,并提供了实例演示如何进行测试用例的加载和执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远不要矫情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值