zoukankan      html  css  js  c++  java
  • python-unittest工作原理

    Pyhon工作原理—— 核心概念:test case, testsuite, TestLoder,TextTestRunner,TextTestResult, test fixture

    TestCase(测试用例): 所有测试用例的基类,它是软件 测试中最基本的组成单元。

                       一个test case就是一个测试用例,是一个完整的测试流程,包括测试前环境的搭建setUp,执行测试代码(run),以及测试后环境的还原(tearDown)。测试用例是一个完整的测试单元,可以对某一问题进行验证。

    TestSuite(测试套件):多个测试用例test case集合就是TestSuite,TestSuite可以嵌套TestSuite

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

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

     TextTestResult:测试结果会保存到TextTestResult实例中,包括运行了多少用例,成功与失败多少等信息

    TestFixture:又叫测试脚手,测试代码的运行环境,指测试准备前和执行后要做的工作,包括setUp和tearDown方法

    二、测试流程:

    1. 写好TestCase:一个class继承unittest.TestCase,就是一个测试测试用例,其中有多个以test开头的方法,那么 每一个这样的,在load的时候会生成一个TestCase实例。如果一个class中有四个test开头的方法,最后load到suite中时则有四个测试用例

    2. 由TestLoder加载TestCase到TestSuite

    3.然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中。

    说明:a:通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者可以直接通过TextTestRunner来执行用例

    b:Runner执行时,默认将结果输出到控制台,我们可以设置其输出到文件,在文件中查看 结果,也可以通过HTMLTestRunner将结果输出到HTML)

    下面写一个简单的单元测试用例

    复制代码
    复制代码
    import unittest
    
    class MyTest(unittest.TestCase):  # 继承unittest.TestCase
        def tearDown(self):
            # 每个测试用例执行之后做操作
            print('111')
    
        def setUp(self):
            # 每个测试用例执行之前做操作
            print('22222')
    
        @classmethod
        def tearDownClass(self):
        # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次
             print('4444444')
        @classmethod
        def setUpClass(self):
        # 必须使用@classmethod 装饰器,所有test运行前运行一次
            print('33333')
    
        def test_a_run(self):
            self.assertEqual(1, 1)  # 测试用例
            
        def test_b_run(self):
            self.assertEqual(2, 2)  # 测试用例
            
    if __name__ == '__main__':
        unittest.main()#运行所有的测试用例
    复制代码
    复制代码

    下面是一些常用的断言,也就是校验结果

    复制代码
    复制代码
            assertEqual(a, b)     a == b      
            assertNotEqual(a, b)     a != b      
            assertTrue(x)     bool(x) is True      
            assertFalse(x)     bool(x) is False      
            assertIsNone(x)     x is None     
            assertIsNotNone(x)     x is not None   
            assertIn(a, b)     a in b    
            assertNotIn(a, b)     a not in b
    复制代码
    复制代码

    那如何生成一个测试报告呢,需要加入另外一个模块了,HTMLTestRunner,这个模块需要自己安装,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果,代码如下:

    复制代码
    复制代码
            import HTMLTestRunner        
            import unittest
            class MyTest(unittest.TestCase):#继承unittest.TestCase
                def tearDown(self):
                    #每个测试用例执行之后做操作
                    print('111')
                def setUp(self):
                    #每个测试用例执行之前做操作
                    print(22222)
                def test_run(self):
                    # self.assertEqual(1,1)
                    self.assertIs(1,1)
                    #测试用例
                def test_run2(self):
                    # self.assertEqual(1,1)
                    self.assertIs(1,1)
                    #测试用例
                def test_run3(self):
                    # self.assertEqual(1,1)
                    self.assertIs(1,1)
                    #测试用例
                def test_run1(self):
                    # self.assertEqual(1,1)
                    self.assertIs(1,1)
                    #测试用例
            if __name__ == '__main__':
                test_suite = unittest.TestSuite()#创建一个测试集合
                test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例
                #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法
                fp = open('res.html','wb')#打开一个保存结果的html文件
                runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api测试报告',description='测试情况')
                #生成执行用例的对象
                runner.run(test_suite)
                #执行测试套件
    复制代码
    复制代码

    如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,逐个执行,代码如下:

    复制代码
    复制代码
            import unittest,HTMLTestRunner
            suite = unittest.TestSuite()#创建测试套件
            all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
            #找到某个目录下所有的以test开头的Python文件里面的测试用例
            for case in all_cases:
                suite.addTests(case)#把所有的测试用例添加进来
            fp = open('res.html','wb')
            runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况')
            runner.run(suite)
            #运行测试
    复制代码
    复制代码

    我们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,但是上面产生的测试报告都是html格式的,Jenkins不认识,就在Jenkins里面显示不出来。那咱们就要产生一些Jenkins认识的测试报告,Jenkins认识xml格式的报告,那咱们就产生xml格式的呗,就需要用一个新的模块,xmlrunner,安装直接 pip install xmlrunner即可,代码如下:

    复制代码
    复制代码
    import unittest
    import xmlrunner
    #导入这个模块
    class My(unittest.TestCase):
     
        def test1(self,a,b,c):
            self.assertEqual(a+b,c)
     
    if __name__=='__main__':
        test_suite = unittest.TestSuite()
        test_suite.addTest(unittest.makeSuite(My))
        runner = xmlrunner.XMLTestRunner(output='report')#指定报告放的目录
        runner.run(test_suite)
    复制代码
    复制代码

    然后咱们运行,可以看到在report目录下已经产生了xml格式的报告了,而且还自动把日期加上了

  • 相关阅读:
    0523注册审核
    0520三级联动
    0519考试练习题
    0516ajax
    mysql 高级查询
    mysql
    HTML的格局与布局
    css样式表
    HTML表单
    HTML
  • 原文地址:https://www.cnblogs.com/qiaoli0726/p/14701904.html
Copyright © 2011-2022 走看看