欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

再话单元测试unittest

发布时间:2025/3/20 24 豆豆
生活随笔 收集整理的这篇文章主要介绍了 再话单元测试unittest 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

      单元测试自然是对程序中最小的可测试模块--函数来进行测试;因为单元测试的对象是函数,也就是说你得被测试对象一定要有输出结果,哪怕就是异常输出,也得有输出,以便单元测试模块能够捕获返回值,并且与预期值进行比较,从而得出测试通过与否。

unittest主要概念:

  • 1. 一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
  • 2.而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
  • 3.TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
  • 4.TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
  • 对于单元测试中, 单元测试的加载方式有2种:
    • 1、通过unittest.main()来启动单元测试的测试模块;
    • 2、另一种是添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例。下面分别列出了2种方法的使用。

    1、测试模块中的函数
  • 被测试的模块:
  • #mathfunc.pydef add(a, b):return a+bdef minus(a, b):return a-bdef multi(a, b):return a*bdef divide(a, b):return a/b

    单元测试模块:

    #-*-coding:utf-8 -*-import unittest from mathfunc import *class TestMathFunc(unittest.TestCase):"Test mathfun.py"def setUp(self):print "do something before test.Prepare environment."def tearDown(self):print "do something after test.Clean up."def test_add(self):"Test method add(a,b)"print "add"self.assertEqual(3,add(1,2))self.assertNotEqual(3,add(2,4))def test_minus(self):"Test method minus(a,b)"print "minus"self.assertEqual(1,minus(3,2))def test_multi(self):"Test method multi(a,b)"print "multi"self.assertEqual(6,multi(2,3))def test_divide(self):"Test method divide(a,b)"print "divide"self.assertEqual(3,divide(6,2))self.assertEqual(2.5,divide(5,2))if __name__ == '__main__':unittest.main(verbosity = 2)

    输出结果:


    2、测试模块中的类方法

    被测模块

    #encoding: utf-8 class myclass: def __init__(self): pass def sum(self, x, y): return x+y def sub(self, x, y): return x-y

    测试模块:

    #encoding: utf-8 import unittest import myclass class mytest(unittest.TestCase): ##初始化工作 def setUp(self): self.tclass = myclass.myclass() ##实例化了被测试模块中的类 #退出清理工作 def tearDown(self): pass #具体的测试用例,一定要以test开头 def testsum(self): self.assertEqual(self.tclass.sum(1, 2), 3) if __name__ =='__main__': unittest.main()

    3、加载测试套件

          在使用测试套件进行单元测试之前,首先来看一下unittest模块有哪些属性,其运作方式,以及根据实际情况如何使用测试套件。

    import unittest print dir(unittest) ['BaseTestSuite', 'FunctionTestCase', 'SkipTest', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'TestSuite', 'TextTestResult', 'TextTestRunner', '_TextTestResult', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__unittest', 'case', 'defaultTestLoader', 'expectedFailure', 'findTestCases', 'getTestCaseNames','installHandler', 'loader', 'main', 'makeSuite', 'registerResult', 'removeHandler', 'removeResult','result', 'runner', 'signals', 'skip', 'skipIf', 'skipUnless', 'suite', 'util']

    知道了unittest有哪些方法和属性之后,来看看这些方法和属性的具体作用方便后续的调用

    memblist = ['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',\ 'TestSuite','TextTestRunner', 'defaultTestLoader','findTestCases', 'getTestCaseNames', \ 'main', 'makeSuite'] for memb in memblist:cur = getattr(unittest,memb)print help(cur)

    输出结果:

     FunctionTestCase:函数测试用例,即给一个函数作为参数,返回一个testcase实例,可选参数有set-up,tear-down方法
     TestCase:所有测试用例的基本类,给一个测试方法的名字,返回一个测试用例实例
     TestLoader:测试用例加载器,其包括多个加载测试用例的方法。返回一个测试套件
     loadTestsFromModule(self, module):根据给定的模块实例来获取测试用例套件

     loadTestsFromName(self, name, module=None) 根据给定的字符串来获取测试用例套件,字符串可以是模块名,测试类名,测试类中的测试方法名,或者一个可调用的是实例对象,这个实例对象返回一个测试用例或一个测试套件。

     loadTestsFromNames(self, names, module=None) :和上面功能相同,只不过接受的是字符串列表
     loadTestsFromTestCase(self, testCaseClass):根据给定的测试类,获取其中的所有测试方法,并返回一个测试套件
    TestProgram:命令行进行单元测试的调用方法,作用是执行一个测试用例。其实unittest.main()方法执行的就是这个命令, 而这个类实例时默认加载当前执行的作为测试对象, 原型为 __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=xx, testLoader=xx) 其中module='__main__'就是默认加载自身
    TestResult:测试用例的结果保存实例,通常有测试框架调用
    TestSuite:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给testRunner进行测试执行
    TextTestRunner:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。显示测试名称,即完成的测试结                                  果,其过同执行单元测试脚本时添加-v参数
    defaultTestLoader:其实就是TestLoader
    findTestCasesgetTestCaseNames:这个2个就不用解释了
    main:其实就是TestProgram

    makeSuite:通常是由单元测试框架调用的,用于生产testsuite对象的实例

    其实整个单元测试框架的逻辑出来了。分三步走:

  • testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;
  •  把自身模块中的所有测试类中中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。
  •  给出一个完整的单元测试组织代码,把该代码放到单元测试用例文件的同一个目录后执行该脚本,即可执行所有的测试用例文件。
  • Python 单元测试框架



    总结

    以上是生活随笔为你收集整理的再话单元测试unittest的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。