【任务描述】:我们已经可以定位到界面上的任何元素了,但是如何根据测试用例集实现自动化测试呢,即自动执行多个测试用例,根据测试情况自动出这个测试用例集的测试报告?
【任务目标】:在Unitest框架上使用数据驱动测试方法设计企业网站内容管理系统后台登录页面测试用例集的自动化测试脚本,掌握Unitest、HTMLTestRunner和数据驱动的使用方法。
【任务储备】:
1、unitest
Unittest是Python自带的单元测试框架,不仅可以用于于单元测试,还可以用于Web自动化测试用例的开发与执行。该测试框架用例组织执行测试用例,并提供丰富的断言方法,判断测试用例是否通过,最终生成测试结果。它将多个测试用例组织在一起执行,如果一个测试用例执行失败,后面的测试用例可以继续执行。Unittest常用方法说明如表1所示。
表1 Unittest常用方法
方法声明 | 功能描述 |
tearDown(self) | 每个测试用例执行之后都会运行一次 |
setUp(self) | 每个测试用例执行之前都会运行一次 |
tearDownClass(self) | 所有测试用例运行完后只运行一次 |
setUpClass(self) | 所有测试用例运行完前只运行一次 |
main() | 执行所有的测试用例 |
testXXX(self) | 具体的测试用例,XXX可以随便命名 |
2、断言
执行自动化测试中最重要的就是判断用例是否执行通过。python UnitTest测试框架提供了一整套内置的断言方法。
⑴如果断言成功,则无影响,代码继续执行,标识该测试用例为成功状态;
⑵如果断言失败,则抛出一个AssertionError,并标识该测试用例为失败状态;
⑶如果用例执行过程中发生异常,则当做错误来处理。
UnitTest框架内置的常用断言方法如表2所示。小贴士:所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
表2 Unittest内置断言方法
方法声明 | 功能描述 |
assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则用例失败 |
assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则用例失败 |
assertTrue(expr, msg=None) | 验证expr是true,如果为false,则用例失败 |
assertFalse(expr,msg=None) | 验证expr是false,如果为true,则用例失败 |
assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则用例失败 |
assertNotIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则用例失败 |
3、HTMLTestRunner
前面测试结果只能在控制台查看,为了方便更多人查看测试结果,unittest提供了HTMLTestRunner库。HTMLTestRunner是Python标准库unittest模块的扩展,生成易于使用的HTML测试报告。使用示例代码如下所示:
unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output=r'c:\1\example_dir',report_title='测试报告',report_name='unitest测试示例'))
output:是输出的文件夹,如果没有定义日志存放位置,日志报告会以html为后缀自动放在“工程目录/reports/file_d”这个路径的文件夹下,并以当前时间命名;
report_title:报告名称;
report_name:报告名称,report_name会自动加上时间后缀,时间格式为%Y-%m-%d-%H-%M-%。
4、界面元素信息获取方法
Selenium提供了多种获取界面元素内容信息的属性和方法,具体如表3所示。
表3 获取界面元素内容信息的属性和方法
方法声明 | 功能描述 |
current_url | 获取当前页面的URL,使用方法示例:driver.current_url |
text | 获取元素的文本值,使用方法示例:driver.find_element_by_id("div").text |
title | 获取当前页面的标题信息,使用方法示例:driver.title |
get_attribute(element_name) | 获取元素的属性值,使用方法示例:driver.find_element_by_id("a1").get_attribute("id") |
get_screenshot_as_file() | 页面截图,用于发现BUG时将图片保存到文件,使用方法示例:driver.get_screenshot_as_file(r’路径名\文件名’),注意:只能存储png格式的图片 |
实例1:使用断言功能验证企业网站内容管理系统不输入密码的情况下提示信息是否正确。
(1)进入企业网站管理内容系统后台登录页面。
(2)在登录页面输入账号和验证码,但是不输入密码。
(3)获取页面上的错误提示信息
(4)使用断言判断获取到的提示信息是否与预期的提示信息一致
(5)如果不一致,则自动对界面进行截图并保存
5、数据驱动测试方法
数据驱动测试,是指由数据的改变引起驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,也就是将测试数据和用例脚本代码分离。由于Python内置了CSV文件读取的代码库,因此测试数据一般存放在CSV文件中。CSV是以逗号分隔值并纯文本形式存储表格数据的一种文件格式,可以用电脑中自带的记事本、WPS或者excel打开。
(1)CSV文件读取方法
使用Python打开CSV可以直接使用open函数打开,然后使用reader函数读取内容。
(2)ddt数据驱动测试方法
数据驱动设计模式的意义在于:实现同一脚本对多组数据进行测试,最终实现数据与脚本的分离,便于维护与扩展。ddt第三方库的使用方法如下所示:
1)@ddt 类装饰器:声明当前类使用ddt数据驱动框架;
2)@data 函数装饰器:通过参数传入测试数据,测试数据可以以字典、元组、列表来进行传入;
3)@file_data函数装饰器:测试数据文件进行传入,可以直接读取yaml/json文件;
4)@unpack 函数装饰器:把传递的数据进行解包(list, tuple, dict)。
数据驱动测试方法步骤如下所示:
1)在头部引入ddt代码块;
2)在测试类前添加@ddt,表示该类采用ddt数据驱动测试
3)在测试方法前添加@ddt.data指定数据源。
【任务实施】
(1)、根据前面设计好的企业网站内容管理系统登陆功能测试用例集设计自动化测试的测试数据,具体测试数据如下图所示。

(2)、根据测试数据和页面结构设计自动化测试脚本,如果测试失败,则自动将错误页面截图保存到本地磁盘。

