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

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

为测试用例排序

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

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 就会按照传入的排序执行测试用例了

自定义xunit测试用例的执行顺序的更多相关文章

  1. unittest测试用例的执行顺序

    unittest的测试顺序为:有几个测试用例,测试固件就会执行多少次. 例如:只有一个测试用例时: setup--testcase1--teardown import unittest class F ...

  2. Selenium实战(四)——unittest单元测试3(测试用例的执行顺序)

    一.测试用例的执行顺序 层级:多个测试目录 > 多个测试文件 > 多个测试类 > 多个测试方法(测试用例).在这里以一个测试执行顺序的脚本为例test_order.py import ...

  3. pytest-调整测试用例的执行顺序

    场景:未考虑按自然顺序执行时,或想变更执行顺序,比如增加 数据的用例要先执行,再执行删除的用例.测试用例默认是按名 称顺序执行的. • 解决: • 安装:pip install pytest-orde ...

  4. ddt读取json文件测试用例的执行顺序

    一. 源码的说明 在源码中,ddt的file_data函数下有这样一段话 意思是说,如果json文件的内容是字典,字典的键名将会作为测试用例名的后缀,字典的值将会作为测试数据,如果这样的话,如果键名字 ...

  5. pytest--配置用例执行顺序(pytest_ordering插件介绍)

    前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...

  6. pytest(4)-测试用例执行顺序

    前言 上一篇文章我们讲了在pytest中测试用例的命名规则,那么在pytest中又是以怎样的顺序执行测试用例的呢? 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09 ...

  7. Robot Framework(十) 执行测试用例——测试执行

    3.2测试执行 本节描述如何执行从解析的测试数据创建的测试套件结构,如何在失败后继续执行测试用例,以及如何正常停止整个测试执行. 3.2.1执行流程 执行套房和测试 设置和拆卸 执行顺序 3.2.2继 ...

  8. python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

    简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...

  9. 14、testng.xml 设置用例执行顺序

    目录如下: TestGroup.java 代码如下: package com.testng.cn; import org.testng.annotations.*; import static org ...

  10. pytest用例的执行顺序

    Pytest执行的顺序 当pytest运行测试函数时,它会查看该测试函数中的参数,然后搜索与这些参数具有相同名称的fixture.一旦pytest找到这些对象,它就会运行这些fixture 影响执行顺 ...

随机推荐

  1. Cilium系列-6-从地址伪装从IPtables切换为eBPF

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  2. go语言全景俯瞰

    本篇是语言教学的"传统项目".每个写go语言教学的人,都会介绍它的发展历程,应用领域,优缺点和特点来介绍自己的理由.当然如果你有自己的理解,那就更好了,欢迎讨论! 全景简介 go语 ...

  3. [postgresql]逻辑备份与还原

    前言 Postgres提供pg_dump和pg_dumpall用于数据库逻辑备份. pg_dumpall:将一个PostgreSQL数据库集群全部转储到一个脚本文件中 pg_dump:可以选择一个数据 ...

  4. CVE-2021-3156 Linux sudo权限提升漏洞复现

    前言: 现在最火的莫不过是这个linux sudo权限提升漏洞了,sudo命令可以说是在linux中十分出名的命令了,在运维时很多时候都需要用到sudo命令,通过此漏洞,可以对具有一定权限的普通用户, ...

  5. 【opencv】传统图像识别:hog+svm实现图像识别详解

    图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息.传统图像识别技术的过程分为信息的获取.预处理.特征抽取和选择.分类器设计和分类决策.本文也是从这四点出发进 ...

  6. 使用MD5算法和sha512sum校验和检验文件完整性

    目录 一.前言 二.MD5算法简介 三.什么是校验和 四.使用MD5算法和sha512sum校验和检验文件完整性 五.总结 一.前言 在我们日常生活中,无论是下载文件.传输数据还是备份重要信息,如何确 ...

  7. #Powerbi 1分钟学会,RANK函数,多字段排名函数.

    一:思维导图&数据源示例 1.1思维导图 1.2示例数据源 二:参数构成 三:案例度量值 基础度量值 总销量 = CALCULATE(SUM('数据源'[销量])) 总销售额 = CALCUL ...

  8. android webview调用js(vue)问题记录

    这几天和别人对接移动端,安卓平台,我们这边输出vue界面,安卓方反馈轮询的时候调用不到,具体原因也定位不到,只能确定前端这边没几句代码,应该没有问题,因此决定自己下载个android studio写个 ...

  9. 构建iOS交叉编译环境

    要进行高级的iOS编程,我们需要很多工具链来帮我们完成这一目的 构建iOS交叉编译环境: 1.新建一个iphone交叉编译虚拟机 2. 为我们的虚拟机添加第二个网卡,设为host-only来达到能与宿 ...

  10. 每日一题:vue3自定义指令大全(呕心沥血所作,附可运行项目源码)

    1.VUE常用指令大全 本项目所有指令均为全局注册,使用时直接在组件中使用即可. 指令目录:src/directives 页面目录:src/views 具体可查看源码 1.1 权限指令 封装一个权限指 ...