码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • python自动化测试——unittest二次开发之根据不同的粒度实现多线程执行测试用例(一)


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


    在这里插入图片描述

    这里写目录标题

    • 一、Unittest用例的执行流程
      • 1、单线程执行测试用例
    • 二、测试套件的结构
      • 1、目录如下:
      • 2、测试文件
        • test_demo1.py
        • test_demo2.py
        • test_demo3.py
        • test_demo4.py
      • 3、代码调试截图
    • 三、测试套件的结构
      • 1、将测试套件拆分为模块级别
        • 特别注意
      • 2、将测试套件拆分为类级别
      • 3、将测试套件拆分为用例级别
    • 四、封装一个可以并发运行unittest测试用例的函数,参数接收两个参数,一个suite(测试套件)和mode(任务粒度:),根据传入的参数model,来对测试套件进行任务拆分,进行并发执行

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

    在这里插入图片描述

  • 相关阅读:
    在Kubernetes环境中有关Nginx Ingress与API Gateway的连接问题
    世界杯之用Java实现随机胜平负
    Windows中睡眠和休眠的区别
    HormonyOS第一课第四章习题答案
    C++入门介绍之“栈”
    移动通信网络规划:勘测输出
    【ChatGPT-应用篇】基于chatGPT覆盖测试过程的初步探索
    二叉树(进阶)
    Day8:寻路算法---深度寻路
    《Python3 网络爬虫开发实战》:方便好用的 requests(1)
  • 原文地址:https://blog.csdn.net/YZL40514131/article/details/126982705
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号