目录
一、unittest2介绍:
- 是python自带的一个单元测试的测试框架
- 可以结合selenium、request实现UI和接口的自动化测试
- 无需额外安装,python中已经加载了unittest2框架
二、基本流程:
- 所以第一步我们直接导入unittest2包即可:import unittest2
- 创建一个类并继承unittest2代码库中的TestCase类,表示我们当前的类是一个测试用例类:class unittest2Demo(unittest2.TestCase)
- 声明一个以test开头的方法:def test_login(self):
- 以test开头表示这个方法是一个测试用例方法,该方法可以直接运行
- 普通的方法就不能直接运行,只有被调用才会执行
- 重写父类中的两个方法:
- setUp(): 在每条测试用例方法开始之前,要做的预置条件。
- tearDown(): 在每条测试用例方法结束后,要做的场景还原。
- 重写父类中的两个方法:
- setUpClass(): 在类中所有方法开始之前,要做的预置条件
- tearDownClass(): 在类中所有方法之后,要做的场景还原工作。
- 需要在方法上面添加装饰器@classmethod
- 在最后添加main方法:
- if__name__=='__main__':
- 如果在当前文件中右键运行,才会执行下面的语句
- 如果在其他文件中右键运行,下面的语句不能被调用和执行
- 调用unittest2.main()方法:表示调用unittest2的主方法,这样就会执行当前类中的所有方法。
- if__name__=='__main__':
- Note:
- 根据光标位置的不同,可以选择执行不同的测试用例。
- 测试类中的用例执行顺序,按照以test开头的方法后的Ascill码顺序执行(0~9,A~Z,a~z)
三、代码举例如下:
# unittest2是一个单元测试框架,接下来学习如何使用这个框架
# 导入包
import unittest2
# 创建类,并继承代码库中的TestCase,表示当前类是测试用例类
class Unittest2Demo(unittest2.TestCase):
def test_login(self):
print("登录")
self.func()
def func(self):
print("不以test开头的普通方法")
def test_register(self):
print("注册")
def test_aaa(self):
print("测试字母排列顺序")
def setUp(self):
print("setUp")
def tearDown(self):
print("tearDown")
@classmethod
def setUpClass(cls):
print("setUpClass")
@classmethod
def tearDownClass(cls):
print("tearDownClass")
if __name__ == '__main__':
unittest2.main()
将光标放在main方法那一行,运行结果如下:
setUpClass
tearDownClass
setUp
测试字母排列顺序
tearDown
setUp
登录
不以test开头的普通方法
tearDown
setUp
注册
tearDown
Ran 3 tests in 0.015s
OK
Process finished with exit code 0
分析结果:
- 一共创建了三个以test开头的测试方法以及一个普通方法,在直接调用的时候只有测试方法被调用。
- 以a开头的case被优先执行,
- 每个case都会执行一遍setUp和tearDown。
- 在类中全部case开始和结束的时候执行setUpClass和tearDownClass.
- 调用setUp和tearDown,setUpClass和tearDownClass的时候和书写位置无关,只要声明就会在每个case调用之前执行。
四、进阶-封装重复代码:
- 创建一个父类BaseTestCase, 实现setUp和tearDown,setUpClass和setUpClass和tearDownClass方法
- 以后的测试用例继承这个父类,继承父类,就继承了父类的所有方法,就不需要再每个用例都重新写方法了。
五、断言
断言---自动判断测试用例执行的结果是否成功
主要检查点有两个:
- 页面级别的检查
- 网页的标题
- 网址
- 页面元素级别的检查
- 元素的文本
- 元素的某个属性
# 获取网页标题
print(self.driver.title)
# 获取网址
print(self.driver.current_url)
# 获取元素文本
welcome = self.driver.find_element(By.CSS_SELECTOR, ".site-nav-right.fr > a:nth-child(1)").text
print(welcome)
# 获取元素的某个属性
search = self.driver.find_element(By.CSS_SELECTOR, ".btn1").get_attribute("value") # 获取搜索按钮的value属性
加上assert断言语句判断对错,最常用的就是判断是否相等assertEqual(预期结果, 实际结果)
self.assertEqual("我的会员中心 - 道e坊商城", self.driver.title)
self.assertEqual("http://localhost/index.php?m=user&c=index&a=index", self.driver.current_url)
self.assertEqual("您好 xujiaming", welcome)
self.assertEqual("搜 索", search)
六、定义suite一次性执行所有用例
- 在项目的根节点创建python文件run_all_cases
- 找出所有的测试用例suite = unittest2.defaultTestLoader.discover("测试用例文件夹名", "测试用例文件名的规则")
- 执行找出的测试用例集
代码如下,找出上述图中所有的测试用例:
import unittest2
if __name__ == '__main__':
suite = unittest2.defaultTestLoader.discover("./test_case", "*Test.py")
unittest2.TextTestRunner().run(suite)
七、生成测试报告
TextTestRunner是unittest2自带的测试报告执行方法,但是它是以文本来显示的,不便于阅读。
所以我们通常是去下载使用HTMLTestRunner来执行测试用例,它提供了一个美观的测试报告的模板
流程:
- 从网上下载HTMLTestRunner模板,但是官网提供的是适用于py2的模板,在py3上想使用的话需要自己修改代码,网上也有很多教程。(在我的资源中我也上传了适用于py3的模板,可以去下载使用)
- 在我们的项目下创建一个名为lib的Python文件夹,用来存放一些额外下载的第三方类。
- 将HTMLTestRunner复制到lib文件夹下。
- 导入类 from lib.HTMLTestRunner import HTMLTestRunner
- 实例化HTMLTestRunner这个类
- file = open(测试报告的路径, "wb")
- 如果不写wb,那就是默认以只读方式打开
- w表示以写的方式打开文件
- b表示以二进制的方式
- HTMLTestRunner(二进制文件, 日志的详细程度, 报告的标题, 报告的正文, 测试人员的名字)
- 格式可以按住ctrl然后点击HTMLTestRunner,直接复制就好了
- file = open(测试报告的路径, "wb")
- 通过这个类的实例化对象,调用run(suite)方法
- 注意:运行模式要改为以python文件而不是测试框架模式运行(在框架中右键默认运行方式是以框架模式运行的),否则是不会生成报告滴。
import unittest2
from lib.HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
# 1. 找到所有需要执行的测试用例
suite = unittest2.defaultTestLoader.discover("./test_case", "*Test.py")
# 2. 执行找到的测试用例集
# unittest2.TextTestRunner().run(suite)
# 3. 生成测试报告
# 3.1指定测试报告的位置
path = "report/TestReport.html" # 新建一个report的名字TestReport.html
file = open(path, "wb") # w表示写,b表示二进制
HTMLTestRunner(stream=file, verbosity=1, title="自动化测试报告", description="测试环境:Chrome", tester="Tom").run(suite)
八、规范:
- 在一个项目文件夹下,按照不同的需求去新建不同的Python文件夹
- test_case文件夹用以存放测试用例
- test_data文件夹用以存放需要导入的数据
- lib用以存放一些第三方类或其他资源
- func可以存放一些封装的方法
- report用来存放生成的报告。
- 在项目文件夹根目录下新建一个python file来执行所有的测试用例。