• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
九五二七乌托邦
博客园    首页    新随笔    联系   管理    订阅  订阅

unittest

unittest是Python单元测试框架,类似于jUnit框架。

unittest中有5个重要的概念: test fixture, test case, test suite, test runner, test loader

Testcase:

  一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp) ,执行测试代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过行这个测试单元,可以对某一个问题进行验证。

Test suite:

  多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。 多个测试用例集合在一起,就是测试套件,而且测试套件也可以嵌套测试套件。

Test runner:

  是来执行测试用例的,其中的run(test) 会执行TestSuite/TestCase中的run(result)方法。

TestLoader:

  是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom_ () 方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回-个TestSuite实例。

Test fixture :

  对一个测试用例环境的搭建和销毁,是- -个fixture,通过覆盖TestCase的setUp()和tearDown()方法来实现。

小例子:品,细品

# -*- coding: utf-8 -*-
import unittest
class MyTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('我是类setUpClass')
@classmethod
def tearDownClass(cls):
print('我是类tearDownClass')
def setUp(self):
print('我是setUp')
def test01(self):
print('第一个测试用例')
self.assertEqual(1+1,2)
def test02(self):
print('第二个测试用例')
self.assertGreaterEqual(2,1)
def tearDown(self):
print('我是tearDown')
if __name__ == '__main__':
unittest.main()

我是类setUpClass
..
我是setUp
----------------------------------------------------------------------
第一个测试用例
Ran 2 tests in 0.000s
我是tearDown
我是setUp
第二个测试用例

我是tearDown
OK
我是类tearDownClass

setup和teardown

方法分类
  分为类方法,类方法只执行一-次
  实例方法,实例方法每次运行用例都执行。

执行顺序.
  setUpClass->setUp->testA->tearDown->setUp->testB>tearDown->tearDownClass
  用例之间按用例名称ASCI码的顺序加载,数字与字母顺序为0~9, A~Z, a~Z。

断言方法:

序号 方法 检查
1 assertEqual(a, b) a==b
2 assertNotEqual(a, b) a!=b
3 assertTrue(x) bool(x) is True
4 assertFalse(x) Bool(x) is False
5 assertls(a, b)

a is b

6 assertlsNot(a, b) a is not b
7 assertlsNone(x) x is None
8 assertlsNotNone(x) X is not None
9 assertln(a, b) a in b
10 assertlsInstance(a, b) isinstance(a,b)
11 assertNotlsInstance(a, b) not isinstance(a,b)

加载测试用例的四种方法

实例化

  suite = unittest.TestSuite()

  loader = unittest.TestLoader()

方法一:通过测试用例类进行加载

  suite.addTest(loader.loadTestsFromTestCase(MyTest1))

  suite.addTest(loader.loadTestsFromTestCase(MyTest2))

# -*- coding: utf-8 -*-
import unittest
class MyTestCase01(unittest.TestCase):
    def test01(self):
        print('第一个测试用例')
    def test02(self):
        print('第二个测试用例')
class MyTestCase02(unittest.TestCase):
    def test03(self):
        print('第三个测试用例')
    def test04(self):
        print('第四个测试用例')
if __name__ == '__main__':
    loader = unittest.TestLoader()
    suite = unittest.TestSuite()
    suite.addTest(loader.loadTestsFromTestCase(MyTestCase01))
    suite.addTest(loader.loadTestsFromTestCase(MyTestCase02))

    runner = unittest.TextTestRunner()
    runner.run(suite)
....
第一个测试用例
----------------------------------------------------------------------
第二个测试用例
Ran 4 tests in 0.000s
第三个测试用例

第四个测试用例
OK

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

  suite.addTest(loader.loadTestsFromModule(MyTest1))

  suite.addTest(loader.loadTestsFromModule(MyTest2))

# *_*coding:utf-8 *_*
# @Author : zyb
# -*- coding: utf-8 -*-
import unittest
class MyTestCase01(unittest.TestCase):
    def test01(self):
        print('第一个测试用例')
    def test02(self):
        print('第二个测试用例')
class MyTestCase02(unittest.TestCase):
    def test03(self):
        print('第三个测试用例')
    def test04(self):
        print('第四个测试用例')
if __name__ == '__main__':
    loader = unittest.TestLoader()
    suite = unittest.TestSuite()
    suite.addTest(loader.loadTestsFromModule(MyTestCase01))
    suite.addTest(loader.loadTestsFromModule(MyTestCase02))
    runner = unittest.TextTestRunner()
    runner.run(suite)

  

方法三:通过路径加载

  import os

  path = os.path.dirname(os.path.abspath(_ file__ ))

  suite.addTest(loader.discover(path))

 

# *_*coding:utf-8 *_*
# @Author : zyb
# -*- coding: utf-8 -*-
import unittest
class MyTestCase01(unittest.TestCase):
    def test01(self):
        print('第一个测试用例')
    def test02(self):
        print('第二个测试用例')
class MyTestCase02(unittest.TestCase):
    def test03(self):
        print('第三个测试用例')
    def test04(self):
        print('第四个测试用例')
if __name__ == '__main__':
    loader = unittest.TestLoader()
    suite = unittest.TestSuite()
    import os
    run_path=os.path.dirname(os.path.abspath(__file__))
    suite.addTest(loader.discover(run_path))
    runner = unittest.TextTestRunner()
    runner.run(suite)

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

  case1 = MyTest1("test1")

  case2 = MyTest1("test2")

  suite.addTest(case1)

  suite.addTest(case2)

# *_*coding:utf-8 *_*
# @Author : zyb
# -*- coding: utf-8 -*-
import unittest
class MyTestCase01(unittest.TestCase):
    def test01(self):
        print('第一个测试用例')
    def test02(self):
        print('第二个测试用例')
class MyTestCase02(unittest.TestCase):
    def test03(self):
        print('第三个测试用例')
    def test04(self):
        print('第四个测试用例')
if __name__ == '__main__':
    loader = unittest.TestLoader()
    suite = unittest.TestSuite()
    case1 = MyTestCase01("test01")
    case2 = MyTestCase02("test04")
    suite.addTest(case1)
    suite.addTest(case2)
    runner = unittest.TextTestRunner()
    runner.run(suite)
第一个测试用例
..
第四个测试用例
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

 

posted @ 2022-03-12 10:05  九五二七乌托邦  阅读(212)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3