1. 简介
本文开始介绍如何通过 unittest 来管理和执行测试用例, 这一篇主要是介绍 unittest 下 addTest() 方法来加载测试用例到测试套件中去, 用 addTest() 方法来加载我们测试用例到 suite 中去和利用 discover() 方法去加载一个路径下所有的测试用例.
2. addTest() 方法
这里首先介绍 unittest 下 addTest() 方法来加载测试用例到测试套件中去. 为了演示效果, 我在前面文章的脚本基础上, 新建了一个测试脚本, 这个测试脚本有一个测试用例, 加上前面的测试脚本, 一共就是三个测试用例, 前面那个测试类里面包括两个测试用例.
新建的测试脚本, test_get_page_title.py 代码如下:
2.1 代码实现:
2.2 参考代码:
- # -*- coding:utf-8 -*-
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-24
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《《一头扎进》系列之 Python+Selenium 框架设计篇 5- 价值好几 K 的框架, 呦! 这个框架还真牛叉哦!!!
- '''
- # 3. 导入模块
- import unittest
- from automation_framework_demo.framework.browser_engine import BrowserEngine
- from automation_framework_demo.pageobjects.baidu_homepage import HomePage
- class GetPageTitle(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- browser = BrowserEngine(cls)
- cls.driver = browser.open_browser(cls)
- @classmethod
- def tearDownClass(cls):
- cls.driver.quit()
- def test_get_title(self):
- homepage = HomePage(self.driver)
- print(homepage.get_page_title())
2.3 运行结果:
运行代码后, 控制台打印如下图的结果
今天来学习下, 如果加载这两个测试类文件里面的 3 个测试脚本. 在 unittest 下有一个管理测试套件的叫 TestSuit(), 我们要使用这个测试套件, 需要先初始化一个 suite 实例, 然后这个实例有一个 addTest() 的方法, 可以加载不同类里面的不同测试函数, 格式这样的 addTest(测试类的类名 ('测试函数名称, 就是 test 开头的函数')), 我们在 testsuites 这个包下新建一个 TestRunner.py 文件用来管理我们的用例启动方式.
来看看这个 TestRunner.py 的内容
2.4 代码实现:
2.5 参考代码:
- # -*- coding:utf-8 -*-
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-24
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《《一头扎进》系列之 Python+Selenium 框架设计篇 5- 价值好几 K 的框架, 呦! 这个框架还真牛叉哦!!!
- '''
- # 3. 导入模块
- import unittest
- #from automation_framework_demo.testsuits import testsuits
- from automation_framework_demo.testsuits.baidu_search2 import BaiduSearch
- from automation_framework_demo.testsuits.test_get_page_title import GetPageTitle
- suite = unittest.TestSuite()
- suite.addTest(BaiduSearch('test_baidu_search'))
- suite.addTest(BaiduSearch('test_search2'))
- suite.addTest(GetPageTitle('test_get_title'))
- if __name__ == '__main__':
- # 执行用例
- runner = unittest.TextTestRunner()
- runner.run(suite)
2.6 运行结果:
运行代码后, 控制台打印如下图的结果
这个方法有没有局限性呢? 当然有, 加入你有几百个测试类, 你是不是也一直这样手动去添加? 有没有其他更好的方法去加载我们的测试脚本, 关于这个问题, 请紧跟宏哥的脚步继续往下看, 往下走.
3. makeSuite() 方法
前面文章介绍了如何用 addTest() 方法来加载我们测试用例到 suite 中去, 本文介绍利用 makeSuite() 方法, 一次性加载一个类文件下所有测试用例到 suite 中去. 还是利用前面一篇文章中的测试脚本, 来看看 TestRunner.py 如何写.
3.1 代码实现:
3.2 参考代码:
- # -*- coding:utf-8 -*-
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-24
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《《一头扎进》系列之 Python+Selenium 框架设计篇 5- 价值好几 K 的框架, 呦! 这个框架还真牛叉哦!!!
- '''
- # 3. 导入模块
- import unittest
- #from automation_framework_demo.testsuits import testsuits
- from automation_framework_demo.testsuits.baidu_search2 import BaiduSearch
- from automation_framework_demo.testsuits.test_get_page_title import GetPageTitle
- '''
- suite = unittest.TestSuite()
- suite.addTest(BaiduSearch('test_baidu_search'))
- suite.addTest(BaiduSearch('test_search2'))
- suite.addTest(GetPageTitle('test_get_title'))
- '''
- suite =unittest.TestSuite(unittest.makeSuite(BaiduSearch))
- if __name__ == '__main__':
- # 执行用例
- runner = unittest.TextTestRunner()
- runner.run(suite)
3.3 运行结果:
运行代码后, 控制台打印如下图的结果
缺陷: makeSuite() 方法虽然比前面文章的 addTest() 方法有了一定的效率提升, 在添加测试用例到测试套件过程. 但是这个方法也有很多缺点, 我不可能把所有项目脚本都放一个测试类文件吧. 在 unittest 中还是有很多方法可以用来添加测试用例到 suite 中, makeSuite(类名称), 只是一种, 你可以多看看 unittest 的文档介绍. 接下来我们介绍如何一次性加载一个文件目录下所有测试用例.
4. discover() 方法
继续接着介绍, 如何利用 unittest 管理和执行测试用例的问题, 这里我们还是利用之前已经有的三条测试用例, 如果你跳过了前面文章, 请回到框架设计篇的第八篇和第七篇, 里面有相关测试类的文件. 本文来介绍, 如果利用 discover() 方法去加载一个路径下所有的测试用例. 这个方法是不是太适合我们现在的需求, 例如我只需要跑 testsuite 包下所有测试用例, 不管在里面有多少个包和多少个测试类, 只需要用 discover() 搞定, 来看看这个场景下 TestRunner.py 如何写.
4.1 代码实现:
4.2 参考代码:
- # -*- coding:utf-8 -*-
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-24
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《《一头扎进》系列之 Python+Selenium 框架设计篇 5- 价值好几 K 的框架, 呦! 这个框架还真牛叉哦!!!
- '''
- # 3. 导入模块
- import unittest
- suite = unittest.TestLoader().discover("testsuits")
- if __name__ == '__main__':
- # 执行用例
- runner = unittest.TextTestRunner()
- runner.run(suite)
4.3 运行结果:
运行代码后, 控制台打印如下图的结果
上面的 testsuits 是可以包名, 也可以是一个文件夹名称, 在实际脚本开发过程中, 最后都采用这个方法来批量管理和执行几百上千的测试用例. 下一篇内容, 大概会介绍如何利用 htmlTestRunner.py 这个开源的插件, 生成测试报告, 这个测试报告是一个 HTML 的格式. 介绍完了生成报告文章, 框架设计系列教程就会结束, 不打算过多介绍其他技能点.
5. 小结
5.1 报错提示: ImportError: Start directory is not importable: 'D:\\PyCharm-Workspace\\testcases'
以下两种路径实现代码存放在 path.py 中, 查看区别:
- base_dir = os.path.dirname(os.getcwd()) # 第一种, 当前目录
- # os.getcwd() 定位路径为 common
- # os.path.dirname(os.getcwd()) 定位路径为 API_work
- base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 第二种, 该代码存放的根目录
- # os.path.abspath(__file__) 定位路径为 path.py
- # os.path.dirname(os.path.abspath(__file__)) 定位路径为 common
- # os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 定位路径为 API_work
以上两种方式, 在 path.py 中执行, print 输出均为:
但第一种方式, 在 run.py 中调用 path.py 中的 base_dir 属性, 查找 "test_*.py" 的根目录就会出现下以报错:
原因:
1, 在 run.py 中调用 path.py 中的 os.getcwd() 代码 , 就是定位 run.py 的根目录;
即:
os.getcwd() 定位路径为 API_work
os.path.dirname(os.getcwd()) 定位路径为 API_work 的上一层目录, 因找不到上一层目录, 所以报错;
2, 在 run.py 中调用第二种方式, 是查找 path.py 的根目录, 所以可执行正常;
总结:
其他模块会调用固定路径时, 不要使用 os.getcwd() 当前定位方式来实现; 使用 os.path.abspath(__file__) 实现.
好了, 今天的分享就到这里吧!!! 谢谢各位的耐心阅读. 有问题加群交流讨论
您的肯定就是我进步的动力. 如果你感觉还不错, 就请鼓励一下吧! 记得随手点波推荐不要忘记哦!!!
别忘了点 推荐留下您来过的痕迹
来源: https://www.cnblogs.com/du-hong/p/12089570.html