unittest和unittestreport的自动化知识整理(失败重跑、禁用(跳过)某个用例、多线程执行用例、生成测试报告,发送报告到邮箱、执行操作相同,入参不同时如何操作)

**

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()
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值