**
1.unittest+unittestreport 失败重跑机制
使用场景:
1、有时候因为网络不好(波动、丢包、延迟),导致用例失败,失败重跑可能就成功了
2、自动化登录时,遇到图片验证码,有时候会识别失败,再次运行可能就成功了
类型一:只给单个用例增加失败重跑机制
给单条测试用例加上失败重运行机制(如果有的用例成功率比较低的时候,可以加上),就调用unittestreport 的 rerun方法,count是用例执行总次数,interval是失败执行间隔,使用rerun方法装饰
import unittest,random
from unittestreport import rerun
'''
给单条测试用例加上失败重运行机制,就调用unittestreport 的 rerun方法,count是用例执行总次数,interval是失败执行间隔
'''
class Test_Case(unittest.TestCase):
@rerun(count=4,interval=2)
def test01(self):
a = random.randint(49,53)
b = 50
print(a)
self.assertEqual(a,b)
if __name__ == '__main__':
unittest.main()
ps:这里的意思就是test01这条用例如果失败,继续重跑三次,只要成功,就不会统计失败次数,运行间隔是2秒
类型二:给所有用例增加失败重跑机制
导入from unittestreport import TestRunner,在运行时候调用rerun_run
方法即可。
放用例的py文件:
import unittest,random
class Test_demo(unittest.TestCase):
def test07(self):
print("我是第一个测试用例test07")
def test08(self):
print("我是第一个测试用例test08")
def test09(self):
print("我是第一个测试用例test09")
a = random.randint(49,53)
b = 50
print(a)
self.assertEqual(a,b)
if __name__ == '__main__':
unittest.main()
运行用例文件:
import unittest
from unittestreport import TestRunner
from test_03 import Test_demo #导入Test_demo类,里面有三个测试用例
#导入测试用例类
#测试套性
suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test_demo)#创建执行对象
runner =TestRunner(suite=suite)
#执行测式用例,失败重运行设置为3次,间隔时间为2秒
runner.rerun_run(count=3, interval=2)
ps:这里的意思是所有用例失败重跑3次,运行间隔是2秒
2.禁用(跳过)某个testcase的方法—完成
使用场景:由于一些需求变更,有的用例可能本次不想运行,但是又不想删除,这时候可以用一个装饰器来忽略本次执行:@unittest.skip("")
@unittest.skip("")括号内可以添加备注,当生成测试报告后,点击详情时,可以看到这个备注
import unittest,time
class Test_demo1(unittest.TestCase):
@unittest.skip("本次不运行")
def test01(self):
print("我是第一个测试用例test01")
time.sleep(1)
def test02(self):
print("我是第一个测试用例test02")
time.sleep(1)
def test03(self):
print("我是第一个测试用例test03")
time.sleep(1)
测试报告内容:
3.多线程执行用例(unittestreport)
使用场景及注意点:
最小单位是类,UI自动化经常用到
1、确保每个线程任务(测试类)在执行的时候不会出现资源竞争(不会对全局依赖的数据进行修改)
2、确保用例类执行没有先后顺序的依赖关系
只需要在run方法中增加thread_count参数,创建多线程之后,会从测试套件中拿取用例,多线程执行
from unittestreport import TestRunner
import unittest,os
#第一步:收集测试用例
pwd = os.getcwd()
suite = unittest.defaultTestLoader.discover(pwd) #不能传绝对路径
print("测试套件中的测试用例数量是:",suite.countTestCases())
# 第二步:运行用例生成测试报告
# 第一种风格的测试报告
runner =TestRunner(suite=suite)
#创建3个线程执行测试用例
runner.run(thread_count=3)
4.生成测试报告,发送报告到邮箱(unittestreport)
使用场景:
实际工作中,自动化脚本运行之后,需要生成测试报告,并且发送邮件给相关人员
from unittestreport import TestRunner
import unittest,os
#第一步:收集测试用例
pwd = os.getcwd()
print(pwd)
# case_path = os.path.join(pwd,"unittestreport数据驱动之列表.py")
suite = unittest.defaultTestLoader.discover(pwd) #自动获取测试用例类
print("测试套件中的测试用例数量是:",suite.countTestCases())
# 第二步:运行用例生成测试报告
runner = TestRunner(suite,
filename="自动化测试报告.html",
report_dir=r"C:\Users\Administrator\Desktop",#放桌面
title='unittestreport学习测试报告',
tester='maoge',
desc="学习项目测试生成的报告",
templates=1 #报告的风格,有三种,取值是1,2,3
)
runner.run()
#第三步:测试结果发送邮件
runner.send_email(
host='smtp.qq.com',
port=465,
user='xxxxxxxx@qq.com',#QQ邮箱账号
password='arfggoufrqlvbbdd',#是QQ邮箱授权码,不是密码
to_addrs=['xxxx@qq.com','xxxx@139.com','xxxx@163.com'] #收件人列表(这里我发给自己)
)
运行结果:
邮件:
5.执行操作相同,入参不同时如何操作
使用场景:当遇到一个页面需要重复输入不同数据时,比如:①一个登录页面,验证异常登录用例数据时;②表单数据验证,需要反复输入不同的数据;③搜索框输入不同的搜索值
unittestreport支持导入yaml、列表、json三种格式数据,把用例所需数据存入文件中,多少条数据就是多少条用例
使用方法:
导入:from unittestreport.core.dataDriver import ddt,list_data,yaml_data,json_data,值得注意的是,每条使用的数据,里面如果带有title字段,就是生成报告中的用例描述,所以,最好加上,value可以是用例标题
列表:
from unittestreport.core.dataDriver import ddt,list_data,yaml_data,json_data
import unittest
#列表中的每个元素就是一个测试用例
test_cases = [(11,22),(88,88),(33,33),(144,33),(19,11),(22,33)
]
@ddt
class TestDome(unittest.TestCase):
@list_data(test_cases)
def test_demo( self,case):
a,b = case
self.assertEqual(a,b)
if __name__ == '__main__':
unittest.main()
yamal:
文件内容:
- testcase_id: 1
data: {'a':11,'b':1}
title: 用例1
- testcase_id: 2
data: {'a':22,'b':22}
title: 用例2
- testcase_id: 3
data: {'a':33,'b':22}
title: 用例3
- testcase_id: 4
data: {'a':11,'b':33}
title: 用例4
- testcase_id: 5
data: {'a':22,'b':88}
title: 用例5
代码内容:
import unittest,os
from unittestreport import ddt,yaml_data
@ddt
class TestDome(unittest.TestCase):
@yaml_data(r'F:\python_code\unittest_demo\cases.yaml')
def test_demo(self,case):
print(case)
if __name__ == '__main__':
unittest.main()
json:
文件内容:
[{
"username": "admin",
"password": "123456",
"title": "json-登录成功"
},
{
"username": "admins",
"password": "123456",
"title": "json-账号不存在"
},
{
"username": "admin",
"password": "12345688",
"title": "json-密码错误"
},
{
"username": "",
"password": "123456",
"title": "json-账号为空"
},
{
"username": "admin",
"password": "",
"title": "json-密码为空"
}
]
代码内容:
import unittest
from unittestreport import ddt,json_data
@ddt
class TestDomeJson(unittest.TestCase):
@json_data(r'D:\pycharm_project\Unittest_study\unittest_demo\cases.json')
def test_demo( self, case):
print(case)
if __name__ == '__main__':
unittest.main()