xUnit测试的顺序执行总结
cmliu
1,演示环境:windows 10企业版+Visual Studio 2019;.NET Core3.1;xUnit 2.4.1;.NET Standard 2.0.3
3,场景描述:前几年在写单元测试时,经常要实现从数据库增删改查的流水线式的单元测试代码;每次修改业务逻辑或者代码后,只要一次运行,就可以把核心功能逻辑调试完;这个过程中会新增数据,还要在结束时把新增的数据删除
这中间就涉及到了顺序测试的;
解决这个问题有两种方式:1,自己写控制执行顺序的执行方法;2,使用xUnit的顺序执行接口;3,自己写jmeter脚本
刚好最近又有个东西要写测试;于是就把.NET Core下使用xUnit顺序执行的这方面的小东西做了个小总结
场景是这样的,调用目标微服务的暴露的某个模块的接口;需要按顺序执行创建表,查询表,修改表,删除表接口;
本文只粘贴了核心的代码,详细demo代码地址可以前往github下载:https://github.com/SaorenXi/XunitTestDemo.git
4,思路:在xUnit的xunit.core程序集中的Xunit.Sdk命名空间下;有一个用于控制执行顺序的接口:ITestCaseOrderer
如下代码为原程序集定义:
#region 程序集 xunit.core, Version=2.4.1.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c
// C:\Users\Administrator\.nuget\packages\xunit.extensibility.core\2.4.1\lib\netstandard1.1\xunit.core.dll
#endregion using System.Collections.Generic;
using Xunit.Abstractions; namespace Xunit.Sdk
{
//
// 摘要:
// A class implements this interface to participate in ordering tests for the test
// runner. Test case orderers are applied using the Xunit.TestCaseOrdererAttribute,
// which can be applied at the assembly, test collection, and test class level.
public interface ITestCaseOrderer
{
//
// 摘要:
// Orders test cases for execution.
//
// 参数:
// testCases:
// The test cases to be ordered.
//
// 返回结果:
// The test cases in the order to be run.
IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase;
}
}
5,为了做方法顺序控制;定义一个名为OrderAttribute属性标签,标签上有个名为Sort的int型属性,用于标记方法的顺序;如下定义(示例是定义在:XUnitTest.Orders命名空间下)
using System; namespace XUnitTest.Orders
{
/// <summary>
/// 测试方法的执行顺序
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class OrderAttribute : Attribute
{
/// <summary>
/// 顺序
/// </summary>
public int Sort { get; set; }
public OrderAttribute(int sort)
{
this.Sort = sort;
}
}
}
6,实现ITestCaseOrderer接口(//按照Order标签上的Sort属性,从小到大的顺序执行),如下定义(示例定义在:SchemaTest命名空间下)
using System.Collections.Generic;
using System.Linq;
using Xunit.Abstractions;
using Xunit.Sdk;
using XUnitTest.Orders; namespace SchemaTest
{
/// <summary>
/// 单元测试的排序策略
/// </summary>
public class TestOrders : ITestCaseOrderer
{
/// <summary>
/// 执行顺序
/// </summary>
/// <typeparam name="TTestCase"></typeparam>
/// <param name="testCases"></param>
/// <returns></returns>
public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
{
string 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");
//按照Order标签上的Sort属性,从小到大的顺序执行
return sortX - sortY;
});
return result;
}
}
}
7,使用;在目标的单元测试类上打上标签使用顺序执行实现类的标签;如下定义(示例中的目标类为:SchemaTest命名空间下的SchemaApiTest类)
//省略其他代码
using Xunit;
using XUnitTest.Orders; namespace SchemaTest
{
//[TestCaseOrderer("ITestCaseOrderer的实现类名称", "ITestCaseOrderer的实现类所在的程序集名称")]
[TestCaseOrderer("SchemaTest.TestOrders", "SchemaTest")]
public class SchemaApiTest
{
//省略其他代码
}
}
8,在目标的测试方法上打上Order标签,定义执行顺序,如下定义(示例使用的是mock数据和接口)
using Xunit;
using XUnitTest.Orders; namespace SchemaTest
{
[TestCaseOrderer("SchemaTest.TestOrders", "SchemaTest")]
public class SchemaApiTest
{
private string _testSchemaCode = $"xunittest123";
private static SchemaDTO _schemaDto = null; /// <summary>
/// 创建记录
/// </summary>
[Fact, Order(1)]
public void AddSchema()
{
var response = new MockClient().AddSchema(new SchemaDTO
{
SchemaCode = _testSchemaCode,
Name = "哈哈"
});
Assert.True(response);
} /// <summary>
/// 查询刚刚创建的记录
/// </summary>
[Fact, Order(2)]
public void GetSchema()
{
var response = new MockClient().GetSchema(_testSchemaCode);
//临时记录
_schemaDto = response;
Assert.NotNull(response);
Assert.Equal(_testSchemaCode, response.SchemaCode);
Assert.Equal("哈哈", response.Name);
} /// <summary>
/// 更新刚刚创建的数据记录
/// </summary>
[Fact, Order(3)]
public void UpdateSchema()
{
_schemaDto.Name = "jiujiu";
var response = new MockClient().UpdateSchema(_schemaDto);
Assert.True(response);
} /// <summary>
/// 查询更新后的记录
/// </summary>
[Fact, Order(4)]
public void GetAfterUpdatedSchema()
{
var response = new MockClient().GetSchema(_testSchemaCode);
Assert.NotNull(response);
Assert.Equal(_testSchemaCode, response.SchemaCode);
Assert.Equal("jiujiu", response.Name);
} /// <summary>
/// 删除记录
/// </summary>
[Fact, Order(5)]
public void RemoveSchema()
{
var response = new MockClient().RemoveSchema(_testSchemaCode);
Assert.True(response);
}
}
}
9,测试
xUnit测试的顺序执行总结的更多相关文章
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- TestNG-详解preserve-order的作用与测试case的执行顺序
在TestNG xml配置文件中,关于<test>的配置里面,有一个属性叫preserve-order,一开始以为这个属性可以用来控制测试case(那些被@Test注解标注的方法)的执行顺 ...
- js的并行加载以及顺序执行
重新温习了下这段内容,发现各个浏览器的兼容性真的是搞大了头,处理起来很是麻烦. 现在现总结下并行加载多个js的方法: 1,对于动态createElement('script')的方式,对所有浏览器都是 ...
- testng xml中按顺序执行java类
如红字部份,将安顺序执行4个类 <?xml version="1.0" encoding="UTF-8"?><suite name=" ...
- C#之使用AutoResetEvent实现线程的顺序执行
前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路.今天在搜索资料的时候无意中再次看到AutoResetEvent这个东 ...
- <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。
原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...
- js函数整合队列顺序执行插件
前言 在日常开发中,也许我们会遇到这样的一个问题.我们利用[发布订阅模式](如果不了解的可以直接访问此链接www.cnblogs.com/xiaoxiaokun- )去执行[发布]事件时,遇到函数内部 ...
- 多命令顺序执行,dd命令,管道|,grep,通配符,其他特殊符号
多命令顺序执行:命令1;命令2 命令之间没有逻辑关系 命令1&&命令2 命令1执行正确才执行命令2,命令1执行错误不会执行命令2 命令1||命令2 命令执行错误才执行命令2,命令1执行 ...
- XUnit测试框架-Python unittest
选择 语言选择 本次个人作业我选择的语言是Python,了解学习Python有一段时间了但是一直没有练习,所以这次玩蛇,使用的版本是Python3.6. 开发工具选择 我选择的IDE是Pycharm, ...
随机推荐
- JavaScript 回调函数的简单示例
回调函数 回调函数也被称为高阶函数 所谓高阶函数,就是说值 函数作为参数被传递或者返回值输出 操作函数的函数称为 高阶函数 把一段可执行的代码(一个函数)作为参数传递给其他的代码(另一个函数),并在需 ...
- effective java之使用构建器来创建对象
第二章第2条:遇到多个构造器参数时要考虑使用构建器(builder) 就是建造者模式(不直接生成想要的对象,而是让客户端利用所有有必要的参数调用构造器或者静态工厂)直接上代码 package com. ...
- java.util.Scanner中hasNext()方法和next()方法的区别
先说结论: 两者均根据空格划分数据 两者在没有数据输入时均会等待输入 next()方法会将空格划分的数据依次输出,运行一次,输出一个 hasNext()方法会跟着next()方法移动,当前数据不为空, ...
- 年近而立,Java何去何从?
摘要:各种新需求新应用层出不尽,各路新生代编程语言异军突起等等,Java未来会不会继续受欢迎?曾经备受关注的Java是否能紧跟时代步伐?新基建时代破茧重生引领云端未来潮流? 1995年第一个Java版 ...
- Linked server的一个问题
好久没有写新的博客,主要是很久没有什么动力和需求来写程序.虽然也不是一点没写,但都缺乏技术含量,没什么可说的. 前两天碰到一个关于linked server的问题.本地的sql server里,通过l ...
- 手把手教你写VueRouter
Vue-Router提供了俩个组件 `router-link` `router-view`, 提供了俩个原型上的属性`$route` `$router` ,我现在跟着源码来把它实现一下 开始 先看平时 ...
- 已废弃_CSDN慕零的黑夜-头条-第一期(必问)[导读:]1.CSDN必问赏金流向何方 2.CSDN必问偷偷做的手脚 3.CSDN必问靠谱吗 4.关于钱于回答的平衡问题:一美元拍卖骗局qq3461896724
[本文有已知的链接差错,懒得改了] 本期是关于CSDN 必问 (biwen.csdn.net)的内容,欢迎评论文末,文中插入有 小姐姐 img(附py代码,1.49G) + coding资料 哟~~~ ...
- yum安装软件时,提示No package netstat available.的解决方法
1. 序言 如笔者在本机上运行netstat时,提示没有这个命令,向来简单粗暴,直接yum -y install netstat,显然是不能正常安装的. [root@hadoop-103 ~]# yu ...
- 手机APP无法抓包(无法连接服务器)
一. 把证书放到系统信任区 前提:手机已root 详细步骤 计算证书名 openssl x509 -subject_hash_old -in charles-ssl-proxying-certific ...
- centos7 + nginx+django 运行环境
.easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安装easy_install 下载地址:https://pypi.python.org/pypi ...