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

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 python自动化测试——unittest二次开发之根据不同的粒度实现多线程执行测试用例(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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')

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123191.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!