zoukankan      html  css  js  c++  java
  • 测试模块_doctest_unittest

    # 1--doctest模块:
    
    # 开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试 doctest模块提供了一个工具,
    # 它会执行 >>>后面的语句,并与下一行的值进行比对,如果一致,测试通过,不一致测试失败。
    # 通过用户提供的例子,它强化了文档,允许 doctest 模块确认代码的结果是否与文档一致: 
    
    def average(values):
        """Computes the arithmetic mean of a list of numbers.
    
        >>> print(average([20, 30, 70]))
        40.0
        """
        return sum(values) / len(values)
    
    def fun_add(x):
        """Computes the 'add' function result.
    
        >>> print(fun_add(3))
        5
        """
        return x+2
    
    
    import doctest
    doctest.testmod()   # 自动验证嵌入测试   TestResults(failed=0, attempted=2)
    
    
    
    
    # 2--unittest模块
    # 最近在做自动化测试,所以对unittest进行了学习。unittest模块有自己的断言,运行用例,组织用例等的属性,所以,掌握了unittest,
    # 自动化也就不会太难了。
    # 不像 doctest模块那么容易使用,不过它可以在一个独立的文件里提供一个更全面的测试集: 
    
    
    
    
    # step 1: 准备一个待测试模块:functions.py,里面有2个函数:
    def average(values):
        """Computes the arithmetic mean of a list of numbers.
    
        >>> print(average([20, 30, 70]))
        40.0
        """
        return sum(values) / len(values)
    
    def fun_add(x):
        """Computes the 'add' function result.
    
        >>> print(fun_add(3))
        5
        """
        return x+2
    
    
    # step 2: 准备一个测试模块test.py,来测试function.py里的函数
    import unittest
    from test import average,fun_add    #导入需要测试的方法
    
    
    class TestFun(unittest.TestCase):
        times = 0
    
        @classmethod
        def setUpClass(cls):
            print('setUpclass')
    
        def setUp(self):
            # 每个测试用例执行之前都会执行该方法,前置工作,比如连接数据库等。
            TestFun.times += 1
            print('setUp', TestFun.times)
    
        def tearDown(self):
            # 每个测试用例执行之后都会执行该方法,后置工作,比如断开数据库等。
            TestFun.times += 1
            print('tearDown', TestFun.times)
            
        def test_average(self):
            # 测试 average函数:
            # 断言:如果相等返回 True,否则返回 False
            self.assertEqual(average([20, 30, 70]), 40.0)
            self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
            # 断言:如果不相等返回 True,否则返回 False
            self.assertNotEqual(average([20, 30, 70]), 30.0)
            # 断言:如果有错误则返回 True,否则返回 False
            self.assertionError(average())
            # 断言:如果成立则返回 True,否则返回 False
            self.assertTrue(1 < 2)
            # 断言:如果符合参数规定的错误类型,则返回 True,否则 False
            self.assertRaises(ZeroDivisionError, average, [])
            self.assertRaises(TypeError, average, 20, 30, 70)
            # 除非:如果表达式为 False,测试失败
            self.failUnless(2 == 2)
            self.failUnlessEqual(2, 2)
            # 实例判断:
            self.assertIsInstance(4, int)
        
        def test_add(self):
            # 测试用例2:fun_add
            self.assertTrue(fun_add(6) == 8)
        
        @unittest.skipIf(True, 'no')       # 第二个参数为字符串类型参数,由用户自己定义内容,描述skip原因。
        def test3(self):
            print('跳过!')
            
        @unittest.skipUnless(False, 'no')  # 第二个参数为字符串类型参数,由用户自己定义内容,描述skip原因。
        def test4(self):
            print('跳过!')
    
        @classmethod
        def tearDownClass(cls):
            print('tearDownClass')
    
    
    
    if __name__ == '__main__':
        # unittest.main()                      # 全部测试
        suit = unittest.TestSuite()            # 部分测试:
        suit.addTest(TestFun('test_average'))  # uit.addTest
        suit.addTest(TestFun('test_add'))
        suit.addTests([TestFun('test3'),TestFun('test4')])  # uit.addTests
        runner = unittest.TextTestRunner()
        runner.run(suit)
    
    

    # 其中前四个是unittest最核心的三个属性。
    # testcase:测试用例;
    # testsuite:测试套件,多个测试用例组成一个测试套件;
    # test runner:执行测试用例,该类中的run()方法会执行testsuite/testcase中的run()方法。测试的结果会保存在testresult中。
    # 还有一个很重要的就是fixture,看着是挺陌生的,其实就是一个测试用例执行之前环境的准备和执行之后环境的销毁。
    
    # 运行结果及解释:
    

  • 相关阅读:
    [BZOJ 1012][JSOI2008]最大数maxnumber(线段树)
    [BZOJ 1011][HNOI2008]遥远的行星(奇技淫巧)
    [BZOJ 1010][HNOI2008]玩具装箱toy(斜率优化Dp)
    [HDU 3507]Print Article(斜率优化Dp)
    [BZOJ 1006][HNOI2008]神奇的国度(MCS弦图的染色)
    [ZOJ 1015]Fishing Net(MCS弦图的判定)
    进程的状态及转换
    程序、进程、线程的概念与比较
    ES6 模块化规范
    DNS域名解析过程(详细)
  • 原文地址:https://www.cnblogs.com/Collin-pxy/p/14079588.html
Copyright © 2011-2022 走看看