zoukankan      html  css  js  c++  java
  • python3+requests库框架设计05-unittest单元测试框架

    unittest单元测试框架,主要由四部分组成:测试固件、测试用例、测试套件、测试执行器

    测试固件(test fixture)

    测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫部分tearDown()

    测试用例(test case)

    测试用例中,包含测试固件,具体的测试代码的函数。测试固件可以不写,但是至少要有一个以test开头的函数。

    unittest会自动识别test开头的函数是测试代码,一定要用小写的test开头!,下面看一个实例

    在PyCharm中新建一个项目,在下面建一个包叫做lesson_unittest,然后在这个包下面新建一个.py文件叫做lesson_test_fixture1,然后写下面的代码

    import unittest
    from io import StringIO
    class lesson(unittest.TestCase):
    
        def setUp(self):
            self.f = StringIO()
            print("创建StringIO")
    
        def tearDown(self):
            s = self.f.getvalue()
            print("读取StringIO:",s)
    
        def test_case1(self):
            self.f.write("test case 1")
            print("写入test case 1")
    
        def test_case2(self):
            self.f.write("test case 2")
            print("写入test case 2")
    
    if __name__ =='__main__':
        unittest.main()

    所有方法中一定要带self这个变量

    unittest.main()在PyCharm可以不要,如果要在cmd中运行,一定要加上这行

    setUp()执行成功之后,不管test中有没有异常发生,tearDown()都会执行

    可以看出上面这个实例在执行每个test之前和之后都会去调用setUp()和tearDown()这个方法

    很多时候我们只想执行一次测试固件:比如setUp()中放着连接数据库操作,多个test case放着不同数据库操作,然后tearDown()断开数据连接

    使用setUpClass()和tearDownClass()可以的得到这样的效果,必须被装饰成classmethod

    使用装饰器@unittest.skip可以跳过某个测试用例不执行

    在刚才lesson_unittest包下,再新建一个.py文件叫做lesson_test_fixture2,然后写下面的代码

    import unittest
    from io import StringIO
    class lesson(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.f = StringIO()
            print("创建StringIO")
    
        @classmethod
        def tearDownClass(cls):
            s = cls.f.getvalue()
            print("读取StringIO:",s)
    
        def test_case1(self):
            self.f.write("test case 1")
            print("写入test case 1")
    
        def test_case2(self):
            self.f.write("test case 2")
            print("写入test case 2")
    
    if __name__ =='__main__':
        unittest.main()


     

    测试执行器(test runner)

    test runner用来执行加载的测试用例,可以是单个测试用例,也可以是测试套件

    一种就是上方实例中的直接使用unittest.main()去执行,会搜索所有以test开头的测试用例,按照ASCII的顺序执行多个用例

    另一种就是使用TextTestRunner()方法初始化一个测试执行器,然后使用run()去执行测试套件

    runner = unittest.TextTestRunner()
    
    runner.run(suite)

    这里suite是指测试套件的实例

    测试套件(test suite)

    很多测试用例的集合就是测试套件,通过测试套件来管理多个测试用例,会根据用例的加载顺序执行用例

    使用TestSuite()初始化一个Suite实例

    使用addTest()方法加载测试方法到测试套件中,addTest()如果要在传入别的包下的测试方法:  包名.类名(测试方法函数)

    suite = unittest.TestSuite()
    suite.addTest(lesson('test_case1'))#lesson是类名,test_case1是测试函数
    suite.addTest(lesson('test_case2'))#如果是lesson是其他包下的,就是包名.lesson(‘test_case2’)
    runner = unittest.TextTestRunner()
    runner.run(suite)

    将文章第一个示例中最后一行unittest.main()换成上方代码执行

    使用makeSuite()可以把一个类下面所有测试方法都加载到测试套件中

    目前项目路径应该是这样的,最上面是项目,然后包,最后是.py文件。一定要有__init__.py文件,不然引用不到

    在项目下新建一个.py文件,名字随便不要带test,或lesson就行。在项目下新建,不要在包里,不要在包里,不要在包里

    import unittest
    from lesson_unittest.lesson_test_fixture1 import lesson
    suite = unittest.TestSuite(unittest.makeSuite(lesson))
    if __name__=='__main__':
        runner = unittest.TextTestRunner()
        runner.run(suite)

    可以看到把lesson两个测试用例都执行了,但是使用makeSuite()还是有些繁琐。要把写的所有的类都加到测试套件中

    最常用的是使用discover()方法可以把指定路径下所有测试方法都加载到测试套件中

    使用刚才实验makeSuite()方法的那个.py文件,清空代码输入以下代码

    import unittest
    test_dir = 'D:/PycharmProjects/PythonLesson/lesson_unittest'
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='lesson*.py')
    runner = unittest.TextTestRunner()
    runner.run(discover)

    test_dir是指定的路径,pattern是指定的文件名。pattern参数是定义文件名匹配规则的,可以随便修改

    比如这里lesson*.py是指文件名以lesson开头的文件

    也可以写成*test*文件带有test的文件

    如果是*lesson.py,那就是指文件名以lesson.py结尾的文件

    *起到跟通配符差不多的作用

  • 相关阅读:
    vue.config.js的配置与注释
    Git Pages,使用gh-pages分支显示静态网站
    git subtree 公共仓库
    vue之计算属性
    前端模块化AMD和CMD
    jQuery实现表单全选反选,简洁,好用
    vue之点击切换样式
    vue之本地代理解决跨域问题
    ES6
    jQuery 总结
  • 原文地址:https://www.cnblogs.com/myal/p/9337373.html
Copyright © 2011-2022 走看看