第二种方式,修改python unittest的执行顺序,使用猴子补丁

1、按照测试用例的上下顺序,而不是按方法的名称的字母顺序来执行测试用例。

之前的文章链接

之前写的,不是猴子补丁,而是要把Test用例的类名传到run里面去执行,与原生的使用有一点区别。现在修改成,用的时候代码与原生unittest完全一模一样,但运行时候使用与原生不同的逻辑。

import time
import unittest
from unittest.main import TestProgram
from app.utils.utils_ydf import LogManager

class CustomTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.logger = LogManager(‘unittest用例的日志‘).get_logger_without_handlers()
    @classmethod
    def tearDownClass(cls):
        time.sleep(1)
        cls.logger.debug(‘---------------------------------所有用例完成-----------------------------‘)
        time.sleep(200000)

    def tearDown(self):
        time.sleep(0.1)

    def setUp(self):
        time.sleep(0.1)

class CustomLoader(unittest.TestLoader):
    def getTestCaseNames(self, testCaseClass):
        """Return a sorted sequence of method names found within testCaseClass
        """

        def isTestMethod(attrname, testCaseClass=testCaseClass,
                         prefix=self.testMethodPrefix):
            return attrname.startswith(prefix) and                    callable(getattr(testCaseClass, attrname))

        testFnNames = list(filter(isTestMethod, dir(testCaseClass)))
        if self.sortTestMethodsUsing:
            testFnNames.sort(key=lambda fun_name: getattr(testCaseClass, fun_name).__code__.co_firstlineno)
        return testFnNames

custom_loader = CustomLoader()

class CustomTestTestProgram(TestProgram):
    def __init__(self, *args, testLoader=custom_loader, **kwargs):
        super().__init__(*args, testLoader=testLoader, **kwargs)

def patch_unittest():
    unittest.TestCase = CustomTestCase
    unittest.defaultTestLoader = custom_loader
    unittest.main = CustomTestTestProgram

if __name__ == ‘__main__‘:
    patch_unittest()

    class _Test(unittest.TestCase):
        def test_3(self):
            print(1)

        def test_2(self):
            print(2)

        def test_1(self):
            print(3)

    unittest.main()

这次的unitetest测试用例写法还是继承原生的Testcase类,执行生成测试用例也是原生的方法。

可以看到,正常情况下应该打印3 2 1 ,但使用了猴子技术后打印是 1 2  3。

运行结果是:

2、可以把调用patch_unittest函数写在最常用的工具包里面,就不用亲自去调用他了。

之前上篇验证过,python的模块只会导入一次,不管你在不同的文件中不同地方import 几百次,都是只会导入一次的。别的地方import 的unitetest的行为都会发生变化。

原文地址:https://www.cnblogs.com/ydf0509/p/9367643.html

时间: 2024-08-02 10:06:02

第二种方式,修改python unittest的执行顺序,使用猴子补丁的相关文章

js最基础知识回顾2(函数传参,操作属性的第二种方式,提取行间事件,操作一组元素,this,焦点问题和鼠标按下抬起,选项卡)

一.函数传参     1.函数传参:参数就是占位符----函数里定不下来的东西 a. var a1=function(){ alert(123); }; function a(f){ // 相当于 f=a1 f(); }; a(a1); b.  function skip(skipPath){  //换肤 var oLink1 = document.getElementById('link1'); oLink1.href=skipPath; } c.   function setStyle(na

创建线程的第二种方式------实现Runnable接口的方式

package cn.itcast.demo16.Demo07.Runnable; /** * @author newcityman * @date 2019/7/22 - 23:17 */public class RunnableImpl implements Runnable { @Override public void run() { for (int i = 0; i <20 ; i++) { System.out.println(Thread.currentThread().getN

创建对象的第二种方式:克隆clone,要实现Cloneable接口

1 ackage com.wisezone.clone; 2 3 /** 4 * 空接口: 5 * 标识,告诉JVM,通行 6 * 1.克隆 7 * 2.序列化 8 * 9 * 创建对象的第二种方式:克隆clone,要实现Cloneable 10 * @author 王东海 11 * @2017年4月15日 12 */ 13 public class TestClone implements Cloneable 14 { 15 public String name; 16 17 public s

python unittest不执行&quot;if __name__ == &#39;__main__&#39; &quot;问题

问题: selenium导入unittest框架和HtmlReport框架后,HtmlReport不被执行. 假设代码为: from selenium import webdriver import unittest class Test(unittest.TestCase): print "this is class Test" def setup(self): print "this is setup" def test_1(self): print "

Java创建线程的第二种方式:实现runable接口

/*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在该run方法中 3.通过Thread类建立线程对象4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函数  为什么要将Runable接口的子类对象传递给Thread的构造函数.  因为,自定义的run方法所属的对象是Runable接口的子类对象  所以要让线程去指定对象的Run

实现键盘录入的第二种方式。。。。。

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner; public class Demo01 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //两种方式实现键盘录入,推荐使用

Struts2框架的数据封装一之属性封装(属性封装的第二种方式:封装成javaBean)

Struts2中提供了两类数据封装的方式? 第一种方式:属性驱动(有两种方式:一个对属性,另外一个是将参数封装到javaBean中) B. 在页面上,使用OGNL表达式进行数据封装.(将参数封装到javaBean中) * 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中. * 在页面中定义一个JavaBean,并且提供set方法:例如:private User user; * 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input

关于整合spring+mybatis 第二种方式

和第一种方式一样的步骤,不过bean.xml中有些许差异 <!-- 配置sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property&g

SpringMVC实现操作的第二种方式

一: 运行效果: 点击提交之后显示效果 二: (1).web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi