Untitest是什么?
unittest是Python自带的一个单元测试框架,
由于unittest是Python自带的标准模块,所以不需要单独再去安装。
引入包import unittest即可使用
为什么要使用unittest
当我们写的自动化用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护
unittest核心的四个概念:
test fixture:一般用于准备及清理工作。
test case:通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充。
test suite:多个测试的集合。
test runner:测试执行
unittest书写规则:
1.测试文件必需以 test 开头
2.测试类必需继承 unittest.TestCase 类
3.测试类必需以 Test 开头
4.测试方法最好以 test 开头
5.在测试的py文件里面去执行代码 unittest.main()
6.在测试类里面可以有普通方法,但需要被测试方法调用
1.入门脚本:
# 导包
import unittest
class TestLogin(unittest.TestCase):
def test_login(self):
"""普通登录"""
print("普通的登录测试")
def test_login_remember(self):
"""记住登录"""
print("记住保存信息登录")
if __name__ == '__main__':
unittest.main()
2.test fixture 测试夹具
方法级别:
setup() 在每一个测试方法执行之前执行 setup 的代码
teardown() 在每一个测试方法执行之后执行 teardown 的代码
类级别:
setupClass() 在每一个测试类执行之前执行的方法 需要使用@classmethod装饰
teardownClass() 在每一个测试类执行之后执行的方法 需要使用@classmethod装饰
例子:
import unittest
class Test_login2(unittest.TestCase):
def test_login(self):
print('普通的登录测试')
def test_login_remember(self):
print("记住密码登录")
def setUp(self):
print("setUp执行的代码,在每一个测试方法执行之前执行")
def tearDown(self) -> None:
print("teardown执行的代码,在每一个测试方法执行之后执行")
@classmethod
def setUpClass(cls) -> None:
print("stupClass执行的代码,在整个测试类执行之前开始执行")
@classmethod
def tearDownClass(cls) -> None:
print("teardownClass执行的代码,在整个测试类执行之后开始执行")
if __name__ == '__main__':
unittest.main()
3.用例执行的顺序
在unittest里面,用例的执行顺序默认是按照 ASCII 码的顺序 自定义测试用例的执行顺序:给每一条用例加上执行的序号
# 给每条用例加上执行的序号
import unittest
class TestLoginPay(unittest.TestCase):
def test_01_login(self):
print('先进行登录')
def test_02_view_page(self):
print("浏览网页,挑选合适的商品")
def test_03_add_cart(self):
print("选择合适的商品加入购物车")
def test_04_create_order(self):
print("生成订单")
def test_05_pay_order(self):
print("支付订单")
if __name__ == '__main__':
unittest.main()
4.断言: 判断预期和实际结果是否相符合
断言:判断预期和实际结果是否相符合
语法
self.assertEqual(a,b,msg='错误描述') 判断 a==b成立则测试用例通过
self.assertTrue(x,msg='错误描述') 判断 表达式x 是否为true,为true通过测试
self.assertIn(a,b,msg='错误描述') 判断 a in b成立则测试通过
# 例子:
import unittest
class TestLogin03(unittest.TestCase):
def test_login(self):
expected = 'admin' # 预期结果
result = "admin2" # 实际结果
print("登录测试")
self.assertEqual(expected, result, msg='登录账号错误')
def test_add_cart(self):
expected = 10
result = 9
print("添加购物车")
self.assertTrue(expected == result, msg='购物车数量不对')
def test_pay_order(self):
expected = "00122"
result = 'order0012'
print("支付订单")
self.assertIn(expected, result, msg='订单号错误')
# self.assertTrue(expected in result,msg='订单号错误')
if __name__ == '__main__':
unittest.main()
5.跳过测试: 1.当我们写的部分用例,在某些情况下不需要执行的时候可以跳过 2.当系统更新之后,部分的测试用例失效,但是不确定后面是否还会再改回来,就直接跳过 语法 装饰器实现的跳过测试用例 @unittest.skip(原因) 没有条件,直接跳过 @unittest.skipIf(表达式,原因) 表达式为真跳过测试 @unittest.skipUnless(表达式,原因) 表达式为假跳过测试
6.测试套件:
test suite 测试套件:把需要执行的测试用例放到一个套子
test runner 测试执行:使用测试执行去执行所有在套子里面的测试用例
语法
测试套件:适合作为调试测试用例
suite = unittest.TestSuite()
suite.addTest(测试类('测试方法'))
测试执行
runner = unittest.TextTestRunner()
runner.run(suite)
# 例子:
import unittest
from Case.test_03_用例执行顺序 import TestLoginPay
from Case.test_04_断言 import TestLogin03
# unittest.main()
# 添加不同的测试用例
# 实例化一个测试套件
suite = unittest.TestSuite()
suite.addTest(TestLoginPay('test_01_login'))
suite.addTest(TestLoginPay("test_04_create_order"))
suite.addTest(TestLogin03("test_login"))
# 实例化一个测试执行
runner = unittest.TextTestRunner()
runner.run(suite)
7.数据驱动:
7.1 安装ddt模块,打开cmd输入pip install ddt在线安装
>>pip install ddt
7.2 数据驱动原理
1.测试数据为多个字典的list类型
2.测试类前加修饰@ddt.ddt
3.case前加修饰@ddt.data()
8.HTMLTestRunner报告:
HTMLTestRunner:第三方插件 示例测试报告地址:http://tungwaiyip.info/software/sample_test_report.html
首先要下载HTMLTestRunner.py文件。
下载地址:HTMLTestRunner - tungwaiyip's software
1.生成的报告应该放在Report里面
2.生成的报告应该以 .html结尾
首先新建一个Python项目,如:My_Report_HTMLTestRunner_Demo。
创建case包,用于存放测试用例(test_case1.py、test_case2.py)。
创建plugins包,用于存放生成测试报告扩展文件(HTMLTestRunner.py)。
创建report文件夹,执行脚本指定测试报告生成在此文件夹里。
创建run_all.py为执行测试用例文件
例子:
import unittest
import HTMLTestRunnerPlugins
import os
import time
# 获取测试报告的路径进行拼接
report_path = os.path.dirname(__file__) + '/Report/'
# 获取当前时间
now = time.strftime('%Y-%m-%d %H_%M_%S')
# 根据路径和时间拼接最终的文件路径
report_name = report_path + now + 'HTMLReport.html'
# 添加执行的测试目录到套件里面
suite = unittest.defaultTestLoader.discover('./Case')
# unittest.TextTestRunner().run(suite)
# 打开我们刚才拼接好的路径
with open(report_name, 'wb') as fq:
# 实例化一个 HTMLTestRunner
runner = HTMLTestRunnerPlugins.HTMLTestRunner(
stream=fq,
verbosity=2,
title='web自动化测试报告',
description="本次执行完所有的测试用例",
tester='第一组'
)
# 执行套件
runner.run(suite)