全面介绍python中很常用的单元测试框架unitest

这篇文章主要介绍了python中很常用的单元测试框架unitest的相关资料,帮助大家更好的利用python进行单元测试,感兴趣的朋友可以了解下

1、unitest主要功能模块介绍

unitest主要包含TestCase、TestSuite、TestLoader、TextTestRunner、TextTestResult这几个功能模块。

  • TestCase:一个TestCase实例就是一个测试用例,一个测试用例就是一个完整的测试流程,包括测试前环境的搭建,测试代码的执行,以及测试后环境的还原或者销毁。元测试的本质也就在这里,一个测试用例是一个完整的测试单元,可以对某一具体问题进行检查验证。
  • TestSuite:多个测试用例集合在一起就是TestSuite,TestSuite也可以嵌套TestSuite。
  • TestLoader:TestLoader的作用是将Testcase加载到TestSuite中。
  • TextTestRunner:TextTestRunner是用来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
  • TextTestResult:TextTestResult用来保存测试结果,其中包括运行了多少测试用例,成功了多少,失败了多少等信息。

整个流程为:写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中。

2、实例介绍

首先准备几个待测的方法,写在test_func.py中。

 def add(a, b): return a + b def multi(a, b): return a * b def lower_str(string): return string.lower() def square(x): return x ** 2

准备好几个待测的方法之后,为这些方法写一个测试用例,写入our_testcase.py中。

 import unittest from test_func import * class TestFunc(unittest.TestCase): """Test test_func.py""" def test_add(self): """Test func add""" self.assertEqual(3, add(1, 2)) self.assertNotEqual(3, add(1, 3)) def test_multi(self): """Test func multi""" self.assertEqual(6, multi(2, 3)) self.assertNotEqual(8, multi(3, 3)) def test_lower_str(self): """Test func lower_str""" self.assertEqual("abc", lower_str("ABC")) self.assertNotEqual("Dce", lower_str("DCE")) def test_square(self): """Test func square""" self.assertEqual(17, square(4)) # 这里故意设计一个会出错的用例,测试4的平方等于17,实际上并不等于。 self.assertNotEqual(35, square(6)) if __name__ == '__main__': unittest.main()

这里写好之后,进入命令行终端,执行python our_testcase.py,执行结果如下。

 ...F ====================================================================== FAIL: test_square (__main__.TestFunc) Test func square ---------------------------------------------------------------------- Traceback (most recent call last): File "our_testcase.py", line 27, in test_square self.assertEqual(17, square(4)) AssertionError: 17 != 16 ---------------------------------------------------------------------- Ran 4 tests in 0.000s FAILED (failures=1)

这里分析一下这个执行结果。首先能够看到一共运行了4个测试用例,失败了1个,并且给出了失败原因,AssertionError: 17 != 16,这是我们故意留下的错误漏洞,被测试用例测试出来了。

第一行...F中,一个点.代表测试成功,F代表失败,我们的测试结果中,前三个成功了,第四个失败了,总共是四个测试,其余的符号中E代表出错,S代表跳过。

特别说明的一点是,测试的执行顺序跟方法的顺序没有关系,四个测试是随机先后执行的。

每个测试方法编写的时候,都要以test开头,比如test_square,否则是不被unitest识别的。

在unitest.main()中加上verbosity参数可以控制输出的错误报告的详细程序,默认是1,如果设为0,则不输出每一用例的执行结果,即上面的第一行的执行结果内容。如果设为2,则输出详细的执行结果。

修改our_testcase.py中主函数。

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

执行结果如下。

 test_add (__main__.TestFunc) Test func add ... ok test_lower_str (__main__.TestFunc) Test func lower_str ... ok test_multi (__main__.TestFunc) Test func multi ... ok test_square (__main__.TestFunc) Test func square ... FAIL ====================================================================== FAIL: test_square (__main__.TestFunc) Test func square ---------------------------------------------------------------------- Traceback (most recent call last): File "our_testcase.py", line 27, in test_square self.assertEqual(17, square(4)) AssertionError: 17 != 16 ---------------------------------------------------------------------- Ran 4 tests in 0.000s FAILED (failures=1)

可以看到,每一个用例的详细执行情况以及用例名,用例描述均被输出了出来,在测试方法下加代码示例中的"""Doc String""",在用例执行时,会将该字符串作为此用例的描述,加合适的注释能够使输出的测试报告更加便于阅读。

3、组织TestSuite

按照上面的测试方法,我们无法控制用例执行的顺序,这样显然是不合理的,因为在一些测试过程中,我们肯定需要控制先测试某些用例,再测试某些用例,这些用例有先后的因果关系。在这里,我们就需要用到TestSuite。我们添加到TestSuite中的case是会按照添加的顺序执行的。

还有一个问题是,我们现在只有一个测试文件,我们直接执行该文件即可,但如果有多个测试文件,怎么进行组织,总不能一个个文件执行吧,答案也在TestSuite中。

新建一个文件,test_suite.py。

 import unittest from our_testcase import TestFunc if __name__ == '__main__': suite = unittest.TestSuite() tests = [TestFunc("test_square"), TestFunc("test_lower_str"), TestFunc("test_multi")] suite.addTests(tests) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)

执行结果如下。

 test_square (our_testcase.TestFunc) Test func square ... FAIL test_lower_str (our_testcase.TestFunc) Test func lower_str ... ok test_multi (our_testcase.TestFunc) Test func multi ... ok ====================================================================== FAIL: test_square (our_testcase.TestFunc) Test func square ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/luyuze/projects/test/our_testcase.py", line 27, in test_square self.assertEqual(17, square(4)) AssertionError: 17 != 16 ---------------------------------------------------------------------- Ran 3 tests in 0.000s FAILE

以上就是全面介绍python中很常用的单元测试框架unitest的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » python