首页 > 其他分享 >自定义xunit测试用例的执行顺序

自定义xunit测试用例的执行顺序

时间:2023-11-06 11:12:12浏览次数:39  
标签:TestOrders 自定义 void 测试用例 xunit 排序 public Fact

有的时候我们会对程序进行单元测试, 为了测试的效果以及后期的维护, 我一般会将各个测试拆开, 根据需要测试的类分到各个类型中, 不过在实际操作的时候就出现了一些意想不到的问题, 各个测试的执行是乱序的, 按照我自己写测试的习惯, 假如我需要测试新写的增删改查的功能, 我会将增删改查分开测试, 会按照 新增-->查询-->修改-->删除 这样的顺序编写, 在我的预想中新增操作应当是最先执行的, 但是在实际的运行过程中完全不是这样, 随机的顺序对这样的测试会有巨大的影响

所以就需要控制测试的执行顺序

为测试用例排序

一般而言, 我们会将增删改查全都放在一个测试集中

public class UserInfoTest
{
    [Fact]
    public void AddTest()
    {
    }
    [Fact]
    public void ReadTest()
    {
    }
    [Fact]
    public void UpdateTest()
    {
    }
    [Fact]
    public void DeleteTest()
    {
    }
}

上面就是增删查改的测试用例, 尽管在写的时候看起来是按照我所希望的那样进行排序的, 但是在实际的执行过程却有可能是完全乱序的, 而我需要他们按照上面的顺序执行

实现ITestCaseOrderer

Xunit 中有一个 TestCaseOrdererAttribute, 加在测试类上时可以对测试类中包含的测试用例进行排序

但若是需要让 TestCaseOrdererAttribute 起效, 我们还需要实现一个接口 ITestCaseOrderer

public class TestOrders : ITestCaseOrderer
{
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
    {
        var result = testCases.ToList();
        return result;
    }
}

通过实现 ITestCaseOrderer 我们可以获取到测试用例, 之后只需要将测试用例重新进行排序, 排序成预期中需要的顺序即可

最简单的就是根据名字来进行排序, 此时只需要使用 result.OrderBy(item => item.DisplayName) 就差不多可以了

但是为了严谨以及后续的可维护性, 最好在做一个新的 Attribute 对需要排序的测试用例进行标记

新建OrderAttribute

[AttributeUsage(AttributeTargets.Method)]
public class OrderAttribute : Attribute
{
    public int Sort { get; set; }
    public OrderAttribute(int sort)
    {
        this.Sort = sort;
    }
}

OrderAttribute 的构成非常简单, 其中只包含一个 Sort 用来进行排序

完善TestOrders的实现

public class TestOrders : ITestCaseOrderer
{
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
    {
        var typeName = typeof(OrderAttribute).AssemblyQualifiedName;
        var result = testCases.ToList();
        result.Sort((x, y) =>
        {
            var xOrder = x.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault();
            if (xOrder == null)
            {
                return 0;
            }
            var yOrder = y.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault();
            if (yOrder == null)
            {
                return 0;
            }
            var sortX = xOrder.GetNamedArgument<int>("Sort");
            var sortY = yOrder.GetNamedArgument<int>("Sort");
            return sortX - sortY;
        });
        return result;
    }
}

完善 TestOrders 的实现, 使得测试用例可以按照顺序进行排序

测试用例打标

[TestCaseOrderer("TestOrders这个类型所在的namespace.TestOrders", "TestOrders这个类型所在的namespace")]
public class UserInfoTest
{
    [Fact, Order(0)]
    public void AddTest()
    {
    }
    [Fact, Order(1)]
    public void ReadTest()
    {
    }
    [Fact, Order(2)]
    public void UpdateTest()
    {
    }
    [Fact, Order(3)]
    public void DeleteTest()
    {
    }
}

TestCaseOrdererAttribute 接收两个参数, 一个是可以用来确定之前实现的 TestOrders 的完整命名空间, 第二个是 TestOrders 所在的命名空间

这两个参数主要的功能就是确定 TestOrders 的位置, Xunit会根据这两个参数找到 TestOrders 并且调用排序的方法

然后在需要进行排序的测试用例上使用 [Order] 打标, 传入自定义的排序, 然后在我们使用 dotnet test 就会按照传入的排序执行测试用例了

标签:TestOrders,自定义,void,测试用例,xunit,排序,public,Fact
From: https://www.cnblogs.com/CollapseNav/p/17812235.html

相关文章

  • SpringBoot通过自定义注解+反射机制比较两个对象不同的属性值
    publicclassFieldComparisonUtil{/**•直接返回一个新的对象,并且对象的值只有被修改的部分••@paramold•@paramsource•@paramisParent•@paramtarget目标对象•@return/**•@paramold进行属性比较的原始数据•@paramsource进行属性比......
  • Java 获取自定义注解 字段值 及 注解值
    自定义注解packagecom.jianmu.bean.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/**[email protected]......
  • 038-第三代软件开发-简易视频播放器-自定义Slider (二)
    第三代软件开发-简易视频播放器-自定义Slider(二)文章目录第三代软件开发-简易视频播放器-自定义Slider(二)项目介绍简易视频播放器自定义Slider(二)横向纵向关键字:Qt、Qml、关键字3、关键字4、关键字5项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-......
  • 034-第三代软件开发-自定义Slider(一)
    第三代软件开发-自定义Slider(一)文章目录第三代软件开发-自定义Slider(一)项目介绍自定义Slider(一)总结一下关键字:Qt、Qml、Slider、position、关键字5项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的......
  • Spring自定义数据校验并实现国际化功能
    通常,当我们需要验证用户输入时,SpringMVC提供标准的预定义验证器。我们会引入spring-boot-starter-validation依赖来实现数据校验功能。但是,当我们需要验证特定类型的输入时,我们就需要创建自己的自定义校验逻辑。这里我们取一个相对简单的校验手机号码的功能来实现。为了校验手......
  • 苹果iOS 17.2年底推送:iPhone 15 Pro的自定义操作按钮功能升级
    据报道,苹果会在年底推送iOS17.2版本,新版系统将会修复iPhone15系列WiFi速度慢的问题。与此同时,iOS17.2将会带来翻译功能,iPhone15Pro的自定义操作按钮切换到翻译选项后,按住会弹出一个翻译窗口,用于翻译设备听到的语音内容。除此之外,这枚自定义操作按钮还可以设置为其它很多功......
  • Windows下,Jar包启动时,自定义cmd窗口名称
    新建bat文件;输入并替换内容; @echoofftitleAPI_XXXX-%date%-%time%-%cd%)java-Dfile.encoding=utf-8 -jar-Xms1024m-Xmx2048m-XX:PermSize=128M-XX:MaxPermSize=256M-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6002XXXX.jar ......
  • prometheus添加自定义监控与告警(etcd为例)
    一、步骤及注意事项(前提,部署参考部署篇)一般etcd集群会开启HTTPS认证,因此访问etcd需要对应的证书使用证书创建etcd的secret将etcd的secret挂在到prometheus创建etcd的servicemonitor对象(匹配kube-system空间下具有k8s-app=etcd标签的service)创建service关联被监控对象二、......
  • 如何做到像坚果云这样自定义 Windows 文件资源管理器的 UI?
    要像坚果云那样自定义Windows文件资源管理器的UI,你可以尝试以下几个步骤:开发一个Shell扩展:使用WindowsShell编程,你可以开发一个Shell扩展程序,它可以插入到Windows文件资源管理器中,并扩展其功能。可以使用编程语言,如C++或C#来编写Shell扩展。注册Shell扩展:一旦你开发完成Shell扩展,......
  • Layui自定义icon图标
    在使用Layui进行开发时,会使用:<iclass="layui-icon">&#xe60c;</i>或者<iclass="layui-iconlayui-icon-face-smile"style="font-size:30px;color:#1E9FFF;"></i>进行图标的引入,但是官方给的图标毕竟有限,有时候没有自己想要的,但在阿里巴巴矢量图标库(ht......