Unittest自动化测试框架教程(二)——Fixture测试夹具的使用和setUp方法相关参数传递
“此文基于系列作品 Unittest自动化测试框架教程(一)——测试用例基本框架介绍 基础上编写,初学者访问此文建议快速浏览链接文章熟悉测试用例基本框架,高手可直接上手阅读 ~ “
PS:“ 学习能力强的朋友也可以通过前情提要快速了解框架 ”
- 博主每篇文章的注释都是干货!每个代码段都有详细注释,一定要认真看注释!!!
- 重要的事情说三遍:一定要看注释!!!一定要看注释!!!一定要看注释!!!
前情提要
- 测试用例基本框架
import unittest class BasicTestCase(unittest.TestCase): # 设置基础测试类名,继承库中测试用例的属性 # setUp()和tearDown()是每个测试用例进行时都会执行的测试方法,前者为起始,后者为结束 # 程序执行流程:setUp()-test1()-tearDown()---setUp()-test2()-tearDown()--- def setUp(self): # 复写父类的方法,是每一个测试用例都会执行的"起始方法" pass # 自定义设置开始步骤 def tearDown(self): # 复写父类的方法,是每一个测试用例都会执行的"结束方法" pass # 自定义设置结束步骤 def way(self): # 根据实际需求编写的测试方法 pass def test1(self): # 设置测试用例1,命名为test+xxx,会按照test后的阿拉伯数字顺序执行,命名为testdemo也执行(优先级小于数字),总之,前缀带test的都会执行 pass # 执行程序+断言(自定义断言方法,灵活多变) def test2(self): # 设置测试用例2 pass # 执行程序+断言(自定义断言方法,灵活多变) if __name__ == '__main__': # 设定条件执行unittest的主函数 unittest.main() # 调用主函数进行多个测试用例测试!!!缺少则可能只进行最后一个用例测试
1.Fixture夹具的使用(unittest中的特殊类方法)
- 特殊类方法setUpClass(),tearDownClass(),在所有测试用例(整体)前后执行
- 作用,改变执行流程:
- setUpClass()---setUp()-test1()-tearDown()---setUp()-test1()-tearDown()---tearDownClass()
- 一定要认真看注释!!!
# 1.特殊类方法setUpClass(),tearDownClass(),在所有测试用例(整体)前后执行# 1.作用,改变执行流程:setUpClass()---setUp()-test1()-tearDown()---setUp()-test1()-tearDown()---tearDownClass()class BasicTestCase(unittest.TestCase): @classmethod # 定义类方法 def setUpClass(cls): # 覆盖父类的类方法 pass @classmethod # 定义类方法 def tearDownClass(cls): # 覆盖父类的类方法 pass def setUp(self): pass def tearDown(self): pass def test1(self): pass def test2(self): passif __name__ == '__main__': # 设定条件执行unittest的主函数 unittest.main()
2. Python关键知识(一)——为3.作铺垫
- 定义类属性,普通方法访问类属性需要通过类名访问,例如test1()中想要获取guide需要通过语句BasicTestCase.guide直接访问类属性
- 语法块中高亮是因为这是在方法中定义的类属性,代码未运行前无法识别,运行时无影响
- 注意与3.做比较
- 一定要认真看注释!!!
# 2.定义类属性,普通方法访问类属性需要通过类名访问,例如test1()中想要获取guide需要通过语句BasicTestCase.guide直接访问类属性# 2.高亮是因为这是在方法中定义的类属性,代码未运行前无法识别# 2.注意与3.做比较class BasicTestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.guide = 'yu' # 在类方法下,定义类属性cls.guide = 'yu' pass def test1(self): # 设置测试用例1 guide = BasicTestCase.guide # 获取类方法中的类属性,通过类名.类属性访问BasicTestCase.guideif __name__ == '__main__': # 设定条件执行unittest的主函数 unittest.main()
3. Python关键知识(二)——为4.作铺垫
-
Python中的特性:如果实例没有相应属性,类属性有,则Python自动访问类属性替代
-
注意与4.作比较
-
一定要认真看注释!!!
# 3.Python中的特性:如果实例没有相应属性,类属性有,则Python自动访问类属性替代(注意与4.作比较)class BasicTestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.guide = 'yu' # 在类方法下,定义类属性cls.guide = 'yu' pass def test1(self): guide = self.guide # 3.在这段话中,这句话也可以获取guide = 'yu',因为语句虽然为self.guide,实例没有定义guide属性, # 3.Python中的特性:如果实例没有属性,Python自动访问类属性替代if __name__ == '__main__': # 设定条件执行unittest的主函数 unittest.main()
4.setUp定义全局实例属性——为5.作铺垫
-
在Unittest套件中,全局实例属性可以在setUp,tearDown中设置
- 注意和当局实例属性区分,与5.作比较
- 一定要认真看注释!!!
# 4.在Unittest套件中,全局实例属性可以在setUp,tearDown中设置,注意与5.做对比class BasicTestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.guide = 'yu' # 在类方法下,定义类属性cls.guide = 'yu' pass def setUp(self): self.guide = 'ba' # 在setUp()方法下,定义 全局实例属性self.guide = 'ba' def test1(self): guide = self.guide # 3.在这段话中,这句话也获取guide = 'ba',因为实例在setUp中定义全局实例属性self.guide = 'ba'if __name__ == '__main__': # 设定条件执行unittest的主函数 unittest.main()
5.当局实例属性与方法间参数依赖
- 普通方法(test1)只可定义"当局"实例属性,生命周期为本方法内,无法制造依赖关系
- 即普通方法test2无法使用test1中定义的实例属性
- 制造方法间依赖关系的手段:使用类属性在每一个方法里传参即可
- 一定要认真看注释!!!
# 5.普通方法只可定义"当局"实例属性,生命周期为本方法内,无法制造依赖关系# 5.制造方法间依赖关系的手段:使用类属性在每一个方法里传参即可class BasicTestCase(unittest.TestCase): def setUp(self): self.guide = 'ba' # 在setUp()方法下,定义"全局"实例属性self.guide = 'ba' def test1(self): guide = 'shi' # 在test1中定义"当局"实例属性guide = 'shi' print(guide) # 这里拿到的guide = 'shi' def test2(self): guide = self.guide print(guide) # 这里拿到的guide = 'ba',而不是'shi',说明普通方法中的实例变量生命周期仅限"当局",无法互相依赖if __name__ == '__main__': # 设定条件执行unittest的主函数 unittest.main()