主要记录Unittest框架和生成html测试报告
为什么使用UnitTest框架?
1. 能够组织多个用例去执行
2. 提供丰富的断言方法
3. 提供丰富的日志与测试结果
Unittest的核心要素
1. TestCase
2.TestSuite
3.TextTestRunner (测试执行)
4.Fixture (对一个测试用例环境的搭建和销毁就是一个fixture)
2.1 TestCase
说明:(翻译:测试用例)一个TestCase就是一条测试用例;
使用:
1. 导包:import unittest --> 导入unitest框架
2. 继承:unittest.TestCase --> 新建测试类继承unittest.TestCase
提示:
1). 测试用例:在自动化测试中,一条用例就是一个完整的测试流程;
2). 测试方法名称命名必须以test开头;
(原因:unittest.TestCase类批量运行的方法是搜索执行test开头的方法)
2.2 TestSuite
说明:(翻译:测试套件)多条测试用例集合在一起,就是一个TestSuite;
使用:
1. 实例化: suite=unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:suite.addTest("ClassName(MethodName)")
(ClassName:为类名;MethodName:为方法名)
3. 添加扩展:suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内test开头的方法并添加到测试套件中)
提示:
1). 一条测试用例(.py)内,多个方法也可以使用测试套件
2). TestSuite需要配合TextTestRunner才能被执行
2.3 TextTestRunner
说明:(翻译:测试执行)是用来执行测试用例套件
使用:
1. 实例化: runner=unittest.TextTestRunner()
(runner:TextTestRunner实例化名称)
2. 执行: runner.run(suite)
(suite:为测试套件名称)
2.4 Fixture
说明:是一个概述,对一个测试用例环境的搭建和销毁就是一个Fixture;
使用:
1. 初始化(搭建):def setUp(self) --> 首先执行
(setUp:此方法继承于unittest.TestCase)
2. 结束(销毁): def tearDown(self) --> 最后执行
(tearDown:此方法继承于unittest.TestCase)
提示:
1. 必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture;
2. setUp:一般做初始化工作,比如:实例化浏览器、浏览器最大化、隐式等待设置
3. tearDown:一般做结束工作,比如:退出登录、关闭浏览器
4. 如果一个测试类有多个test开头方法,则每个方法执行之前都会运行setUp、结束时运行tearDown
断言
基本布尔型断言(掌握常用即可)
说明:结果只有True和False
序号 | 断言方法 | 断言描述 |
---|---|---|
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 | assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
6 | assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
7 | assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail【掌握】 |
...
# 获取登陆信息
text = self.driver.find_element_by_css_selector(".loginfo").text
print("登陆成功信息为:",text)
try:
# 使用断言 判断text是否包含admin字符
self.assertIn("admin",text)
except AssertionError:
driver.get_screenshot_as_file("../Image/02img.jpg")
# 抛出异常
raise
...
为什么要生成测试报告
1. 测试报告是本次测试目的最终体现形态
2. 测试报告内包含了有关本次测试用例的详情
HTML生成报告方式
1. Export Test Results (UnitTest 自带)
2. HTMLTestRunner(第三方模板)【重点】
2.1 Export Test Results (自带)
自带报告生成操作图
提示:适合单条用例执行时使用
2.2 HTMLTestRunner【重点】
1.1 测试报告 生成步骤分析
1. 复制HTMLTestRunner.py文件到项目文件夹
2. 导入HTMLTestRunner、UnitTest包
3. discover加载要执行的用例
(discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py"))
4. 设置报告生成路径和文件名
(file_name=file_dir+nowtime+"Report.html")
5. 打开报告 with open(file_name,'wb') as f:
6. 实例化HTMLTestRunner对象:runner=HTMLTestRunner(stream=f,[title],[description])
参数说明:
(stream:文件流,打开写入报告的名称及写入编码格式)
(
[],为可选;
title为报告标题,如XXX自动化测试报告
description:为说明;比如操作系统、浏览器等版本
)
7. 执行:runner.run(discover)
1.2 实现代码
import time
from CodeEdit.LX04.Tools.HTMLTestRunner import HTMLTestRunner
import unittest
# 加载当前目录
test_dir='.'
# 加载当前目录下iweb开头的.py文件
discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
if __name__ == '__main__':
# 定义报告目录
file_dir="../Report/"
# 定义报告名称格式
nowtime=time.strftime("%Y-%m-%d %H_%M_%S")
# 报告完整路径和名称
file_name=file_dir+nowtime+"Report.html"
with open(file_name,"wb")as f:
# 实例化HTMLTestRunenr对象,传入报告文件流f
runner=HTMLTestRunner(stream=f,title="iweb_shop项目Web自动化测试报告",description="测试用例共计2条")
runner.run(discover)
1.3 总结
1. HTMLTestRunner作用
2. 使用HTMLTestRunner生成报告操作步骤