python自动化测试——unittest二次开发之根据不同的粒度实现多线程执行测试用例(一)

CSDN话题挑战赛第2期
参赛话题:学习笔记


在这里插入图片描述

一、Unittest用例的执行流程

在这里插入图片描述

TestRunner的工作流程:

遍历测试类中的测试用例,调用用例对象的run方法
将测试用例的结果保存到TestResult中

1、单线程执行测试用例

特别注意:
如果测试粒度按照文件为单位,那么文件中的测试类执行顺序就能得到保证
如果测试粒度按照测试类为单位,那么测试类中的测试用例执行顺序就能得到保证
如果测试粒度按照测试用例为单位,并且用例与用例之间有关联,那么测试用例执行顺序得不到保证

import unittest
from unittest import TestCase,TestSuite,TestLoader,TestResult


'''
粒度——》测试文件
粒度——》测试类
粒度——》用例级别
'''
from concurrent.futures.thread import ThreadPoolExecutor
#todo 加载用例到测试套件中
suite=unittest.defaultTestLoader.discover(r'D:\project_development\测试开发\day11\testcases')

print('-------------------------单线程执行--------------------------------------')
#todo 创建一个测试结果记录器
result=unittest.TestResult()
#todo 执行测试套件
suite.run(result)
print(suite)
print('用例执行的结果,',result)

二、测试套件的结构

1、目录如下:

在这里插入图片描述

2、测试文件

test_demo1.py

import time
import unittest
from ddt import ddt,data

@ddt
class DemoA1(unittest.TestCase):
    @data(1,2,3,6)
    def test_demoa1(self,item):
        time.sleep(1)
        print('---------test_demoa1--------',item)


@ddt
class DemoA2(unittest.TestCase):
    @data(1,2,3,6)
    def test_demoa2(self,item):
        time.sleep(1)
        print('---------test_demoa2--------',item)

test_demo2.py

import time
import unittest
from ddt import ddt,data

@ddt
class DemoB1(unittest.TestCase):
    @data(1,2,3,6)
    def test_demob1(self,item):
        time.sleep(1)
        print('---------test_demob1--------',item)


@ddt
class DemoB2(unittest.TestCase):
    @data(1,2,3,6)
    def test_demob2(self,item):
        time.sleep(1)
        print('---------test_demob1--------',item)

test_demo3.py

test_demo4.py

3、代码调试截图

在这里插入图片描述

在这里插入图片描述

三、测试套件的结构

1、将测试套件拆分为模块级别

特别注意

套件可以直接执行,套件中有run方法

model_suite=[m for m in suite]
result=unittest.TestResult()

创建一个线程池对象,一共创建了4个模块,所以max_workers最大为4
with ThreadPoolExecutor(max_workers=4) as tp:			#创建一个线程池对象
    for i in model_suite:
        #i.run(result)
        tp.submit(i.run,result)

2、将测试套件拆分为类级别

class_suite=[]
for m in suite:
    for c in m:
        class_suite.append(c)

result=unittest.TestResult()
with ThreadPoolExecutor(max_workers=8) as tp:
    for i in class_suite:
        tp.submit(i.run,result)

3、将测试套件拆分为用例级别

case_list=[]
for m in suite:
    for c in m:
        for i in c:
            case_list.append(i)
result=unittest.TestResult()
with ThreadPoolExecutor(max_workers=32) as tp:
    for i in case_list:
        tp.submit(i.run,result)

四、封装一个可以并发运行unittest测试用例的函数,参数接收两个参数,一个suite(测试套件)和mode(任务粒度:),根据传入的参数model,来对测试套件进行任务拆分,进行并发执行

import unittest
from unittest import TestCase,TestSuite,TestLoader,TestResult

'''
粒度——》用例级别
粒度——》测试类
'''
from concurrent.futures.thread import ThreadPoolExecutor
#todo 加载用例到测试套件中
suite=unittest.defaultTestLoader.discover(r'D:\project_development\测试开发\day11\testcases')


print('-------------------------多线程执行--------------------------------------')


def run_cases(suite,model):
    #判断任务执行粒度
    task_list = []
    if model=='case':
        for m in suite:
            for c in m:
                for i in c:
                    task_list.append(i)
    elif model=='cls':
        for m in suite:
            for c in m:
                task_list.append(c)
    else:
        task_list=[i for i in suite]


    result=unittest.TestResult()
    with ThreadPoolExecutor(max_workers=8) as tp:
        for i in task_list:
            tp.submit(i.run,result)


run_cases(suite,'asd')

在这里插入图片描述

  • 56
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 48
    评论
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值