【一、前言】
上篇文章中,小编对Python-UiAutomator2使用、环境搭建、应用及操作进行了介绍,基于PyUnit+uiautomator2+HTMLTestRunner,本篇将介绍在项目中实现冒烟级别用例、定制需求等自动化测试执行的实践。
【二、PyUnit测试框架】
1、首先了解测试框架的基本原理和概念
python的单元测试框架PyUnit,可以认为是Java语言下的单元测试框架JUnit的Python语言实现版本,甚至其作者之一Kent Beck就是JUnit的作者。
unittest要达到如下目标:
(1). 支持自动化测试;
(2). 让所有的测试脚本共享开启(setup)和关闭(shut down)的代码;
(3). 可以通过集合(collections)的方式来组织测试用例脚本;
(4). 将所有的测试脚本从测试报告框架中独立出来;
unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner。
(1). 测试装置(TestFixture)为一个或者多个测试用例做一些准备工作,例如:连接一个数据库,创建一个目录,或者开启一个进程;
(2). 测试用例(TestCase)测试用例是测试行为的最小单元,一个TestCase的实例就是一个测试用例,是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。
(3). 测试套件(TestSuite)将测试用例或者测试用例集合聚合组织起来的集合。可以批量执行一个测试套件内所有的测试用例;TestSuite也可以嵌套TestSuite。
(4). 测试执行器(TestRunner)组织安排测试脚本执行活动的组件。测试执行器通过一些图形界面,文本界面或者返回一些特殊的值来展示测试脚本的测试结果。主要用于生成测试报告;run(test)会执行TestSuite/TestCase中的run(result)方法,测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
2、unittest模块的各个属性说明
(1)unittest的属性如下
'BaseTestSuite','FunctionTestCase','SkipTest','TestCase','TestLoader','TestResult', 'TestSuite','TextTestResult','TextTestRunner','defaultTestLoader','expectedFailure','loader', 'main', 'runner', 'skip', 'skipIf', 'skipUnless','suite', 等
unittest.TestCase:TestCase类,所有测试用例类继承的基本类。
unittest.main():使用她可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。
unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
unittest.defaultTestLoader():defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。
unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
@unittest.skip(reason):skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason):skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason):skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure():expectedFailure()测试标记为失败。
(2)TestCase类的属性如下:
setUp():用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。
tearDown():用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。
assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。
assertEqual、assertNotEqual、assertTrue、assertFalse、assertIs、assertNotIs、assertIsNone、assertIsNotNone、assertIn、assertNotIn、assertIsInstance、assertNotIsInstance
(3)TestSuite类的属性如下:(组织用例时需要用到)
'addTest', 'addTests','countTestCases', 'debug', 'run'等
addTest():方法是将测试用例添加到测试套件中。
(4)TextTextRunner的属性如下:(组织用例时需要用到)
'_makeResult', 'buffer', 'descriptions', 'failfast','resultclass', 'run', 'stream', 等
run():运行测试套件的测试用例,入参为suite测试套件。
【三、unittest基本示例】
1、apktool简介、配置
AutoTestReport.py
Test_case目录下case示例
sangde_custommade.py
结合上例,我们可以找到unittest中对应的具体实现对象:
(1). 测试装置(test fixture)由setUp函数来做初始化工作,由tearDown做销毁工作
(2). 测试用例(test case)对应TestCase类,或者更细化的对应里面的测试脚本函数
(3). 测试套件(test suite)对应TestSuite类
(4). 测试执行器(test runner)对应TextTestRunner类
【四、python-生成HTMLTestRunner测试报告】
HTMLTestRunner是Python标准库的unittest模块的一个扩展,它可以生成HTML的测试报告。
(1). 安装HTMLTestRunner
首先下载HTMLTestRunner.py文件,将下载的文件放入…\python\Lib目录下
python3版下载地址:http://pan.baidu.com/s/1dEZQ0pz
在IDLE里引入HTMLTestRunner包,如果没有报错,则说明添加成功,如下图:
(2). 导入模块:import HTMLTestRunner
(3). 生成TestReport
【五、应用实践】
本地testlist
选择要执行的testsuite
执行结果示例
TestReport示例(可查看出错的Testcase错误原因)
【六、参考】
https://blog.csdn.net/galen2016/article/details/73251240
https://blog.csdn.net/xiaosongbk/article/details/52933022
https://www.cnblogs.com/yufeihlf/p/5707929.html