说明:
1、该篇博客所用到的代码已上传网盘,自行下载。提取码:2mqs
2、未特别注明的代码在testbaidu1.py和testbaidu2.py文件里,大多数在testbaidu1.py里
3、百度网盘里testbaidu.py是学习数据驱动之前的代码备份(因为感觉数据驱动部分代码有点乱)
1、unittest的框架了解
unittest是python的单元测试框架(只是功能自动化),也可以对程序最小模块进行敏捷化测试。在自动化测试中,我们虽然不需要做白盒测试,但是必须知道所使用语言的单元测试框架。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,到时候直接执行,同时引入测试报告。
主要解决的问题:
批量执行: 一次执行不同类里的不同方法,unittest框架提供的测试套件可以将不同文件下的不同类下的不同方法集合起来统一执行;
参数化: 一个测试方法有不同的参数进行测试,unittest可以只写一个方法,然后传递不同的参数;
断言: 判断两个不同参数的结果是否一致
测试报告: 输出测试结果,以html的形式
unitest各组件的关系:
test fixture 测试固件。setUp()和setDown()是固定的方法;setUp()功能是初始化操作,比如驱动浏览器打开网址或定义全局变量;setDown()的功能是清理测试环境,比如测试完毕关闭浏览器;
test case 测试用例。编写单元测试用例最常用的类
test suite 测试套件。单元测试用例的集合,批量执行测试用例,其方法有addTest(),loadTest()
test runner 执行测试用例。
test report 生成测试报告。
2、批量执行脚本
1、构建测试套件:TestSuite
addTest() ,makeSuite(),TestLoader(),discover()的应用
(1)addTest():测试套件可将多个测试用例整合到一起放在一个容器里执行。unittest模块中提供了TestSuite类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。
(2)makeSuite()和TestLoader():在unittest 框架中提供了makeSuite() 的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite ,unittest 调用makeSuite的时候,只需要把测试类名称传入即可;TestLoader 用于创建类和模块的测试套件,一般的情况下,使TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。
(3)discover():discover 是通过递归的方式到其子目录中从指定的目录开始, 找到所有测试模块并返回一个包含它们对象的TestSuite ,然后进行加载与模式匹配唯一的测试文件,discover 参数分别为 discover(dir,pattern,top_level_dir=None)
如下图所示是每个方法的使用方法。
执行结果:代码在文章开头的说明里,自行下载(执行文件:runall.py)
2、用例的执行顺序
执行顺序按照:0—9 ,A—Z,a—z。
即:类名test_后面的首字母按照0—9 ,A—Z,a—z的顺序执行。对于测试目录与测试文件来说,unittest框架同样是按照这个规则来加载测试用例。
3、忽略用例执行
若想要忽略执行某个测试方法,则在该测试方法前面加上标签:@unittest.skip(“skipping”)
下图是忽略掉一个测试方法执行后的结果:
3、unittest断言
判断预期结果是否和实验结果相等。对于每个单独的case来说,一个case的执行结果中,必然会有期望结果与实际结果,就会通过断言来判断该case是通过还是失败。在unittest的库中提供了大量的使用方法来检查预期值与实际值,来验证case的结果,检查条件大体分为等价性,逻辑比较以及其他,若给定的断言通过,测试会继续执行到下一行的代码,如果断言失败,对应的case测试会立即停止或者生成错误信息(一般是打印错误信息),但是不影响其它case执行。
常用断言:
序号 | 断言方法 | 断言描述 |
---|---|---|
1 | assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail |
2 | assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail |
3 | assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
4 | assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
5 | assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail |
6 | assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail |
7 | assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
8 | assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
9 | assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail |
10 | assertNotIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则fail |
11 | assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例,不是则fail |
12 | assertNotIsInstance(obj, cls, msg=None) | 验证obj不是cls的实例,是则fail |
断言示例:
> 另外在selenium IDE录制的时候也可以断言(打开界面后右击,如下图),但是格式是pytest
4、生成HTML报告(HTMLTEstRunner)
首先确认这个目录(C:\Users\dell\AppData\Local\Programs\Python\Python38\Lib)下是否有HTMLTestRunner.py文件,没有的话,下载地址为:HTMLTestRunner.py
生成测试报告的部分代码及注释如下图所示(网盘下载完整代码:text.py)
> 执行完的结果为:
> 生成报告后查看的结果:
5、异常捕捉与错误截图
如下图所示是断言时若发生错误便生成错误截图的代码加注释:
> 执行结果—>错误截图:
6、数据驱动
当需要多次执行一个案例时(有很多的测试用例),有多少测试用例就编写多少案例无疑既浪费时间又浪费空间。那么可以使用数据驱动来解决这一问题。python自带的unittest没有自带数据驱动功能,所以若使用unittest框架的同时也想使用数据驱动,那么就可以在cmd下载:下载语句为:pip install ddt,查看是否安装好的语句是:pip show ddt
ddt的参考使用文档
想要说的都在图片里了
一次传一个参数:
一次传两个参数(一组参数,有限个,可以以下图的形式存在):
一次传两个参数(一组参数:无限个,需要写在文件里):
若参数在json文件里则按如下图所示操作: