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测试的顺序执行总结的更多相关文章

  1. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  2. TestNG-详解preserve-order的作用与测试case的执行顺序

    在TestNG xml配置文件中,关于<test>的配置里面,有一个属性叫preserve-order,一开始以为这个属性可以用来控制测试case(那些被@Test注解标注的方法)的执行顺 ...

  3. js的并行加载以及顺序执行

    重新温习了下这段内容,发现各个浏览器的兼容性真的是搞大了头,处理起来很是麻烦. 现在现总结下并行加载多个js的方法: 1,对于动态createElement('script')的方式,对所有浏览器都是 ...

  4. testng xml中按顺序执行java类

    如红字部份,将安顺序执行4个类 <?xml version="1.0" encoding="UTF-8"?><suite name=" ...

  5. C#之使用AutoResetEvent实现线程的顺序执行

    前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路.今天在搜索资料的时候无意中再次看到AutoResetEvent这个东 ...

  6. <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。

    原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...

  7. js函数整合队列顺序执行插件

    前言 在日常开发中,也许我们会遇到这样的一个问题.我们利用[发布订阅模式](如果不了解的可以直接访问此链接www.cnblogs.com/xiaoxiaokun- )去执行[发布]事件时,遇到函数内部 ...

  8. 多命令顺序执行,dd命令,管道|,grep,通配符,其他特殊符号

    多命令顺序执行:命令1;命令2 命令之间没有逻辑关系 命令1&&命令2 命令1执行正确才执行命令2,命令1执行错误不会执行命令2 命令1||命令2 命令执行错误才执行命令2,命令1执行 ...

  9. XUnit测试框架-Python unittest

    选择 语言选择 本次个人作业我选择的语言是Python,了解学习Python有一段时间了但是一直没有练习,所以这次玩蛇,使用的版本是Python3.6. 开发工具选择 我选择的IDE是Pycharm, ...

随机推荐

  1. C#LeetCode刷题之#231-2的幂(Power of Two)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3858 访问. 给定一个整数,编写一个函数来判断它是否是 2 的幂 ...

  2. 实型(浮点型):float、double

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib. ...

  3. node.js 出现server instance pool was destroyed

    初步判断为MongodbClient断开连接的原因. 之所以断开连接,可能是多个操作间隔时间比较久. 解决方法之一,不要调用close方法.

  4. 已废弃_CSDN慕零的黑夜-头条-第一期(必问)[导读:]1.CSDN必问赏金流向何方 2.CSDN必问偷偷做的手脚 3.CSDN必问靠谱吗 4.关于钱于回答的平衡问题:一美元拍卖骗局qq3461896724

    [本文有已知的链接差错,懒得改了] 本期是关于CSDN 必问 (biwen.csdn.net)的内容,欢迎评论文末,文中插入有 小姐姐 img(附py代码,1.49G) + coding资料 哟~~~ ...

  5. Linux命令--vi/vim复制一行,粘贴

    在光标的位置按“yy”,复制当前行: 然后再光标的行按“p”,粘贴到下一行,原来的往下顺移

  6. linux 强制重启!

    原文链接:https://www.cnblogs.com/wipy/p/4261472.html 有时候,linux 由于硬盘或者其它原因, 某个进程挂住了,怎么也杀不死, 输入 reboot 命令也 ...

  7. golang grpc demo

    1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...

  8. ceph osd跟cpu进行绑定

    通过cgroup将ceph-osd进程与某一个 CPU core 绑定脚本: mkdir -p /sys/fs/cgroup/cpuset/ceph # cup number : ,,, = - ec ...

  9. 计算机网络-传输层(3)TCP协议与拥堵控制

    TCP是因特网传输层的面向连接的可靠的运输协议.   TCP被称为是面向连接的:通信双方在发送数据之前必须建立连接,连接状态只在连接的两端中维护,在沿途节点中并不维护状态. TCP连接包括:两台主机上 ...

  10. win7中java编程工具安装 java环境变量设置

    一.下载java 官方地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html ...