Selenium自动化测试-unittest单元测试框架使用
什么是unittest
这里我们将要用的unittest是python的单元测试框架,它的官网是 25.3. unittest — Unit testing framework — Python 2.7.18 documentation,在这里我们可以得到全面的信息。
当我们写的用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护,而unittest正是这样一款工具。我们这里用一个示例来展示用unittest脚本是什么样子的
View Code
通过这个我们大概对unittest有个直观的了解了。unittest.main():使用它可以将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
unittest中的概念
TestCase
一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown。unittest.TestCase类,所有测试用例类继承的基本类。此类提供了很多assert方法用于检查比较,部分如下:
多数方法都可以见其名知其意,使用的门槛很低。
TestSuite
对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中。
TextTestRunner
是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中。
TestFixture
测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。
知道了这几个主要的概念,我们就可以把上面的脚本中的最后一行unittest.main()
,改为以下代码:
1 #构造测试套件 2 suite = unittest.TestSuite() 3 suite.addTest(SearchTest("test_search")) 4 #执行测试 5 runner = unittest.TextTestRunner() 6 runner.run(suite)
执行之后发现和之前用unittest.main()的结果一样。
用例组织
这里我们假设,脚本当中有多个TestCase如test_case1,test_case2…,那我们应该怎样去控制它们的执行顺序呢?
执行测试用例方案一
直接用
unittest.main()
执行,这里它搜索所有以test开头的测试用例方法,按照ASCII的顺序执行多个用例。
执行测试用例方案二
先实例化测试套件,将用例加载进去,再用TextTestRunner去执行用例:
1 suite=unittest.TestSuite() 2 suite.addTest(Test('test_case2')) 3 suite.addTest(Test('test_case1')) 4 runner=unittest.TextTestRunner() 5 runner.run(suite)
执行的顺序是用例的加载顺序,比如这里是先执行2后执行1。
执行测试用例方案三
在方案2中,如果我们有成百上千个用例的话,一个一个add进去,是不太现实的,那么我们可以用defaultTestLoader来加载:
1 test_dir = './' 2 discover = unittest.defaultTestLoader.discover(test_dir, pattern='*test.py') 3 runner = unittest.TextTestRunner() 4 runner.run(discover)
这里用./指定了当前目录,指定了*test.py文件,对其当中的用例进行执行,顺序和方案一相同。
如果这里指定的目录下面有多个经pattern匹配上的.py文件呢?调用discover方法,首先通过test_dir定义查找目录,如果文件名满足定义的pattern,那么我们要用for循环来找出所有被筛选出来的用例,并将其循环加到套件中,主要代码如下:
1 for test_suite in discover: 2 for test_case in test_suite: 3 test_unit.addTests(test_case)
由上面组织用例的方式我们可以知道,在实际的测试用脚本开发中,我们可以在目录下创建xx.py的文件,当用例稳定运行后,可以修改成test_xx.py,以便于添加到测试套件中。注意,文件名的匹配规则,我们可以随便由pattern参数定义。
如果要执行多级目录结构的用例呢?要想被discover读取执行,我们要在目录下加_ init _.py文件
一个例子
下面简单的介绍一个用unittest组织的用例结构,先建立D:\Test_Project目录,下面放上test_case和test_report来分别存放用例和报告。
编写测试用例
在test_case下面编写用例,如下简单的示范了在百度上搜索关键字和点击设置的操作:
View Code
为了显示出组织测试用例的效果,我们将此文件再复制一份,把文件名和方法名等修改一下:
View Code
美化报告样式和发送结果邮件
上面我们写了 两个测试用例作为示例,我们也可以添加更多的进去。接着我们使用HTMLTestRunner这个开源模块来美化测试报告,关于它的下载使用可以参考HTMLTestRunner · PyPI。然后,我们可以在代码中写上运行完成之后自动发送测试邮件出来,便于我们查看。请参看以下代码:
View Code
在上面的代码中我们使用了runner = HTMLTestRunner.HTMLTestRunner()
方法来代替runner = unittest.TextTestRunner()
,是为了使用HTMLTestRunner这个模块来美化和输出美观的报告。然后调用方法来发送邮件。运行此文件后,可以得到以下输出的报告:
可以看见使用这个可以清晰的看到用例的执行情况, 也便于查看失败用例的原因去调试它,同时在们输入的收件箱也会收到一份通知邮件,我们可以将此输出报告添加到正文或附件中,以便于查看
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
上图的资料 在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)
群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。
相关文章
- Google官方网络框架Volley实战——QQ吉凶测试,南无阿弥陀佛!
- E2E测试框架
- 什么是自动化测试框架
- 〖Python WEB 自动化测试实战篇⑪〗- 实战 - 利用 unittest 框架设计应用改写脚本
- 〖Python WEB 自动化测试实战篇⑫〗- 实战 - PageObject框架设计(亦叫做 “页面对象” 模式)
- 〖Python接口自动化测试实战篇⑪〗- 实战 - 结合 unittest 框架实现接口测试的断言
- 软件界旷世之架:测试驱动开发(TDD)之争
- pytest接口自动化测试框架 | 使用装饰器修饰需要运行的用例
- pytest接口自动化测试框架 | pytest获取执行数据、pytest禁用插件
- pytest接口自动化测试框架 | pytest配置文件
- pytest接口自动化测试框架 | conftest.py和@pytest.fixture()结合
- pytest接口自动化测试框架 | 基于Pytest的Web UI自动化测试框架介绍
- pytest接口自动化测试框架 | parametrize中ids的用法
- pytest接口自动化测试框架 | 单个/多个参数
- 接口测试 — 接口自动化框架的发送邮件实现
- 发一下接口自动化测试框架(python3+requests+excel)
- 接口自动化测试框架需要具备什么功能?
- 七、Pytest自动化测试框架 — Pytest断言
- 全功能Python测试框架:pytest
- 测试开发实战项目 | 搭建Pytest接口自动化框架
- 4款火热的Python自动化测试框架,谁才是你的唯一?
- UI自动化测试框架搭建 —— 编写一个APP自动化
- UnitTest自动化测试框架中skip的用法
- 接口测试——PyTest自动化测试框架(八)