zoukankan      html  css  js  c++  java
  • 【Python】unittest-3

    一、@unittest.skip("skipping this case") # 无条件忽略该测试方法

    二、@unittest.skipIf(a > 5, "condition is not satisfied!") #如果变量a > 5,则忽略该测试方法

    三、@unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux") # 除非执行测试用例的平台是Linux平台,否则忽略该测试方法  win32是windows

    四、测试集

    1、  unittest自身包括的方法有:

    ['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',
     'TestSuite','TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',
     'defaultTestLoader','findTestCases', 'getTestCaseNames', 'main', 'makeSuite']

    2、 每个方法的含义

     '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
     'findTestCases', 'getTestCaseNames':这个2个就不用解释了
     'main': 其实就是TestProgram
     'makeSuite':通常是由单元测试框架调用的,用于生产testsuite对象的实例

    五、单元测试总结

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

    六、测试集参数配置

    1、  verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果

    2、  参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunner输出html报告。

     
    #练习:
    import random
    import unittest
    import sys
     
    class TestSequenceFunctions(unittest.TestCase):
        a = 1
     
        def setUp(self):
            self.seq = list(range(10))
     
        @unittest.skip("skipping") # 无条件忽略该测试方法
        def test_shuffle(self):
            random.shuffle(self.seq)
            self.seq.sort()
            self.assertEqual(self.seq, list(range(10)))
            self.assertRaises(TypeError, random.shuffle, (1, 2, 3))
     
        # 如果变量a > 5,则忽略该测试方法
        @unittest.skipIf(a > 5, "condition is not satisfied!")
        def test_choice(self):
            element = random.choice(self.seq)
            self.assertTrue(element in self.seq)
     
        # 除非执行测试用例的平台是Linux平台,否则忽略该测试方法  win32是windows
        @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
        def test_sample(self):
            #期望抛出什么样的error
            with self.assertRaises(ValueError):
                random.sample(self.seq, 20)
            for element in random.sample(self.seq, 5):
                self.assertTrue(element in self.seq)
     
     
    if __name__ == '__main__':
        # unittest.main()
        #使用测试集的方法执行
        #装载测试用例(该句话等价于suite = [TestSequenceFunctions("test_shuffle"),TestSequenceFunctions
     
    ("test_choice"),TestSequenceFunctions("test_sample")])
        suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
     
        #使用测试套件并打包测试用例
        suite = unittest.TestSuite(suite)
       
        #保存unittest的测试输入日志到文件
        log_name="e:\test4\log.txt"
        #verbosity=2是指测试结果的输出的详细程度
        #stream = f是指将结果输出到文件f
        with open(log_name,"w+") as f:
            result=unittest.TextTestRunner(stream = f,verbosity = 2).run(suite)
        #unittest.TextTestRunner(verbosity = 2).run(suite)
     
      #生成测试报告
        print"testsRun:%s" %result.testsRun
        print"failures:%s" %len(result.failures)
        print"errors:%s" %len(result.errors)
        print"skipped:%s" %len(result.skipped)
  • 相关阅读:
    【C++】C++代码动态检查
    【加解密】使用CFSSL生成证书并使用gRPC验证证书
    分库分表下跨库join解决方案
    解决1235
    为什么v-for中的key值不推荐使用index
    弹性布局公共样式总结
    关于python的模块
    [转]Ubuntu18.04安装uwsgi错误:error: lto-wrapper failed collect2: error: ld returned 1 exit status
    python 坐标遍历 生成笛卡尔积矩阵
    Mongo BsonUndefined 转换问题(自定义Mongo类型转换器)
  • 原文地址:https://www.cnblogs.com/jingsheng99/p/9103081.html
Copyright © 2011-2022 走看看