seyOrd

导航

unittest框架的TestFixtrue,TestCase,TestSuite,TestRunner_byseyOrd

测试模型
(1)线性测试
1、概念:
通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。(操作,重复操作,数据)都混合在一起。
2、优点:每个脚本相对独立,且不产生其他依赖和调用。任何一个测试用例脚本拿出来都可以单独执行。
3、缺点:开发成本高,用例之间存在重复的操作。比如重复的用户登录和退出。
维护成本高,由于重复的操作,当重复的操作发生改变时,则需要逐一进行脚本的修改。
4.线性测试实例:用户登录
(2)模块化驱动测试
1、概念:
将重复的操作独立成功共模块,当用例执行过程中需要用到这一模块操作时则被调用。
操作+(重复操作,数据)混合在一起。例如,自动化测试的执行需要保持测试用例的独立性和完整性,所以每一条用例在执行时都需要登录和退出操作,so可以把登录和退出的操作封装为公共函数。
2、优点:由于最大限度消除了重复,从而提高了开发效率和提高测试用例的可维护性。
3、缺点:虽然模块化的步骤相同,但是测试数据不同。比如说重复的登录模块,如果登录用户不同,依旧要重复编写登录脚本。
4.实例:对公共模块,例如登陆和退出进行模块化封装
(3)数据驱动测试
1、概念:它将测试中的测试数据和操作分离,数据存放在另外一个文件中单独维护。
通过数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
操作+重复操作+数据分开。
2、优点:
通过这种方式,将数据和重复操作分开,可以快速增加相似测试,完成不同数据情况下的测试。要达到模块化与数据驱动,必须先对用例进行有效的管理,unittest是目前最流行的自动化测试框架,它提供了用例组织与执行方法,也提供了丰富的断言方法。

unittest框架

(1)unittest框架是组织用例以及测试执行的一套自动化测试框架。

(2)提供了提供用例组织与执行方法,提供了断言方法。

(3)unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner。

TestFixtrue部分

(1)测试固件是用于一个测试环境的准备和销毁还原。当测试用例每次执行之前需要准备测试环境,每次测试完成后还原测试环境,比如执行前连接数据库、打开浏览器等,执行完成后需要还原数据库、关闭浏览器等操作。这时候就可以启用testfixture。

(2)unittest的测试固件

 

class TestCase(unittest.TestCase):
# 重写TestCase的setUp() tearDown()方法:在每个测试方法执行前以及执行后各执行一次
    def setUp(self):    # 钩子方法
        print("do something before test : prepare environment")
    def tearDown(self): # 钩子方法
        print("do something after test : clean up ")    
    @classmethod
    def setUpClass(self):    # 钩子方法
        print("do something before class")
    @classmethod    
    def tearDownClass(self): # 钩子方法
        print("do something after class")  
# def 用例方法

 

TestCase部分

(1)测试用例一般写在测试固件的钩子方法后面,是实现某段业务逻辑的代码段

(2)测试用例的注意点

    测试用例的命名以test开头

    测试用例按照用例方法名的ascii码顺序进行加载。所以前后有业务逻辑关系的用例方法必须小心命名

(3)unittest的测试用例

import unittest

class TestCase(unittest.TestCase):
    # 继承自unittest.TestCase
    def setUp(self):
        print("do something before test : prepare environment")

    def tearDown(self):
        print("do something after test : clean up ")
    
    # 测试方法均已test开头或结尾,否则是不被unittest识别的
    def test_add(self):
        print("add:")
        self.assertEqual(3,add(1,2))

    def test_minus(self):
        print("minus")
        self.assertEqual(3,minus(5,2))

    def test_multi(self):
        print("multi")
        self.assertEqual(6,multi(2 ,3))

    def test_divide(self):
        print("divide")
        self.assertEqual(2,divide(4,2))

if __name__ == "__main__":
    # 在main()中加verbosity参数,可以控制输出的错误报告的详细程度
    # verbosity=*:默认是1;设为0,则不输出每一个用例的执行结果;2-输出详细的执行结果
    unittest.main(verbosity=2)

TestSuite和TestRunner部分

(1)测试套件是控制测试执行顺序,测试顺序与添加进测试套件的顺序相同,一般通过addTest()或者addTests()向suite中添加

(2)测试运行器是用来运行测试套件中的测试用例的

(3)unittest的测试套件与测试运行器

 

if __name__ == "__main__":
    suite = unittest.TestSuite()
    # 定义list,按照list里的顺序执行测试用例
    tests=[TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")]
    suite.addTests(tests)
    runner = unittest.TextTestRunner(verbosity=2)#执行测试用例。runner.run(test)会执行TestSuite、TestCase中的run(result)方法。
    runner.run(suite)

(4)测试套件更优的加载方式

  TestLoader 的discover方法
    用discover()来加载测试多个测试用例,再用TextRunner类的run()方法去一次执行多个脚本的用例,达到批量执行的效果。
    discover方法里面有三个参数:
    -case_dir:这个是待执行用例的目录。
    -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
    -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

    注意注意这样加载的方式的测试用例的执行顺序是按照测试用例方法名的ASCII码的顺序执行。

  TestLoader 的其它加载方法

    unittest.TestLoader().loadTestsFromTestCase(testCaseClass)
    unittest.TestLoader().loadTestsFromModule(module)
    unittest.TestLoader().loadTestsFromName(name,module=None)     unittest.TestLoader().loadTestsFromNames(names,module=None)     unittest.TestLoader().getTestCaseNames(testCaseclass)     unittest.TestLoader().discover()

 

posted on 2020-04-11 12:59  seyOrd  阅读(358)  评论(0)    收藏  举报