返回顶部
首页 > 资讯 > 精选 >Net6 Xunit集成测试问题怎么解决
  • 759
分享到

Net6 Xunit集成测试问题怎么解决

2023-06-30 15:06:00 759人浏览 安东尼
摘要

本篇内容主要讲解“Net6 Xunit集成测试问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Net6 Xunit集成测试问题怎么解决”吧!1.新建测试项目2.使用

本篇内容主要讲解“Net6 Xunit集成测试问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Net6 Xunit集成测试问题怎么解决”吧!

1.新建测试项目

Net6 Xunit集成测试问题怎么解决

2.使用到的类库

Net6 Xunit集成测试问题怎么解决

Xunti与xunit.runner.visualstudio创建测试项目是自带

Xunit.Extensions.Ordering 这是一个排序执行测试方法的扩展,因为有些方法是需要按照顺序执行,如获取图形验证码-->发送手机验证码-->到获取Token这是一个有序的过程,如果没有按照顺序执行肯定是不对的。

3.注入

就是将要测试项目的所有注入重新注入测试项目(Program.cs)中和Startup中的所有东东全部注入,NET6中默认取消了Startup类,那么就要手工全部将这些注入再测试项目中添加一次,注入的时候有些是不兼容的做一下小的改动就行,因为https://GitHub.com/pengweiqhca/Xunit.DependencyInjection的注入还是停留在NET5以下版本的,哦对了,还有中间件也是需要在测试项目中添加的,

1 NET5 以下,测试项目中的Startup需要自己手工创建,区别在于NET5项目有Startup注入的时候不用手动写很多东西,测试项目直接从项目中的Startup查找注入,

public class Startup    {        // custom host build        public void ConfigureHost(IHostBuilder hostBuilder)        {            hostBuilder                .ConfigureHostConfiguration(builder =>                {                    builder.AddJSONFile("appsettings.json", true);                })                .ConfigureWEBHostDefaults(builder =>                {                    builder.UseStartup<Dx.H5.Service.Startup>();//此处为项目中的startup,不是测试项目中的startup                    builder.UseTestServer();                    builder.ConfigureServices(services =>                    {                        services.AddSingleton(sp => sp.GetRequiredService<IHost>()                            .GetTestClient()                        );                    });                })                ;        }        // add services need to injection        // ConfigureServices(IServiceCollection services)        // ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext)        // ConfigureServices(HostBuilderContext hostBuilderContext, IServiceCollection services)        public void ConfigureServices(IServiceCollection services)        {            // ready check            //services.AddHostedService<ReadyCheckHostedService>();        }        public void Configure(ILoggerFactory loggerFactory, ITestOutputHelperAccessor outputHelperAccessor)        {            loggerFactory.AddProvider(new XunitTestOutputLoggerProvider(outputHelperAccessor));        }    }

2 NET6 ,测试项目中的Startup需要自己手工创建,NET6 项目取消了Startup那么就需要手工搬移所有的注入,需要注意的是Startup中的ConfigureServices不支持重载,也就是你只能用一个ConfigureServices方法,见如下示例,还有测试日志的注入,但是在测试项目中使用ILogger<>好像是有问题的,有时日志不打印, 使用private readonly ITestOutputHelperAccessor _testOutputHelperAccessor; 替代ILogger<>,直接在测试类构造函数中注入就行

public class Startup    {        const string DefaultCorsPolicyName = "Default";        public void ConfigureHost(IHostBuilder hostBuilder) =>            hostBuilder.ConfigureWebHost(webHostBuilder => webHostBuilder                .UseTestServer()                .Configure(Configure)                .UseUrls("Http://*:17890","http://*:17880")                .ConfigureServices(services =>                {                    services.AddSingleton(sp => sp.GetRequiredService<IHost>()                            .GetTestClient()                        );                })            )            .ConfigureAppConfiguration(lb => lb.AddJsonFile("appsettings.json", false, true));        public void ConfigureServices(IServiceCollection services, HostBuilderContext context)        {            services.AddControllers();            services.AddEndpointsapiExplorer();            services.AddswaggerGen();            services.AddHttpClient();        }        public void Configure(ILoggerFactory loggerFactory, ITestOutputHelperAccessor accessor) =>        loggerFactory.AddProvider(new XunitTestOutputLoggerProvider(accessor));        ////public void ConfigureHost(IHostBuilder hostBuilder) { }        //public void ConfigureServices(IServiceCollection services)        //{        //}        //public IHostBuilder CreateHostBuilder(AssemblyName assemblyName)         //{        //    return new HostBuilder();        //}        private void Configure(IApplicationBuilder app)        {            //if (app.Environment.IsDevelopment())            //{            //    app.UseSwagger();            //    app.UseSwaggerUI();            //}            app.UseRouting();            app.UseAuthorization();            app.UseEndpoints(endpoints =>            {                endpoints                .MapControllers();                endpoints.MapGet("/hb/generatetoken", context =>                {                    return context.Response.WriteAsync(GenerateToken(context));                });            });        }        string GenerateToken(HttpContext httpContext)        {            return "dfdfdfdfd";        }    }public static IEnumerable<object?[]> ReadFile()        {            yield return new object[] { "123"};            yield return new object[] { "456" };        }

4.创建测试类测试方法:

需要注意的是api接口测试中url忽略host与端口,默认端口配置请查阅https://github.com/pengweiqhca/Xunit.DependencyInjection文档,UnitTest2中的测试方法是带有数据集合的测试方法,及测试方法是执行多次的,测试方法中的参数数据就是由MemberData(nameof(ReadFile)),其中数据方法ReadFile必须是 public staticReadFile要不然会有报错

using Microsoft.Extensions.Logging;using Newtonsoft.Json;using System.Collections.Generic;using System.net.Http;using System.Net.Http.Headers;using System.Threading.Tasks;using Xunit;using Xunit.DependencyInjection;using Xunit.Extensions.Ordering;using static webapiXunit.Controllers.WeatherForecastController;namespace Xunit.WebApiTest{    [Order(1)]    public class UnitTest1    {        private HttpClient _client;        private ILogger<UnitTest1> _logger;        //private readonly ITestOutputHelperAccessor _testOutputHelperAccessor;        public UnitTest1(            //ITestOutputHelperAccessor testOutputHelperAccessor            ILogger<UnitTest1> logger,            HttpClient client            )        {            _logger = logger;            _client = client;        }        [Order(1)]        [Fact(DisplayName = "1")]        public async Task Test1()        {            var c = new MyClass();            c.Name = "1";            c.Description = "e";            using var request = new HttpRequestMessage(HttpMethod.Post, "WeatherForecast/hb/post/add");            var content = JsonConvert.SerializeObject(c);            request.Content = new StrinGContent(content);            request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");            var resp = await _client.SendAsync(request);            //var resp=await _client.GetAsync("/hb/generatetoken");            _logger.LogInfORMation("成功");            if (resp.IsSuccessStatusCode)            {                var str = await resp.Content.ReadAsStringAsync();                Assert.True(true);                return;            }            Assert.True(false);        }        [Order(2)]        [Fact(DisplayName = "2")]        public async Task Test2()        {            var c = new MyClass();            c.Name = "1";            c.Description = "e";            using var request = new HttpRequestMessage(HttpMethod.Post, "WeatherForecast/hb/post/add");            var content = JsonConvert.SerializeObject(c);            request.Content = new StringContent(content);            request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");            var resp = await _client.SendAsync(request);            //var resp=await _client.GetAsync("/hb/generatetoken");            //_testOutputHelperAccessor.Output.WriteLine("");            _logger.LogInformation("成功");            if (resp.IsSuccessStatusCode)            {                var str = await resp.Content.ReadAsStringAsync();                Assert.True(true);                return;            }            Assert.True(false);        }    }    [Order(2)]    public class UnitTest2    {        private HttpClient _client;        private ILogger<UnitTest2> _logger;        public UnitTest2(            ILogger<UnitTest2> logger,            HttpClient client            )        {            _logger = logger;            _client = client;        }        [Theory]        [MemberData(nameof(ReadFile))]        public async Task Test2(string name)        {            _logger.LogInformation(name);            Assert.True(true);        }        public static IEnumerable<object?[]> ReadFile()        {            yield return new object[] { "123"};            yield return new object[] { "456" };        }    }}

5.排序执行测试方法:

使用Xunit.Extensions.Ordering进行排序执行测试方法时:首先在测试项目中新建一个AssemblyInfo.cs加入如下内容,主要没有类名及命名空间,其中[assembly: TestFramework("Xunit.Extensions.Ordering.TestFramework", "Xunit.Extensions.Ordering")]是一个按照集合进行排序的使用,但是他与已有xunit assembly冲突,暂时么有找到解决方法,所以该排序功能暂时不支持,类中的[Order(2)]为第一优先级排序顺序,方法中的[Order(2)]即在类的顺序下再排序

using Xunit;
using Xunit.Extensions.Ordering;
[assembly: CollectionBehavior(DisableTestParallelization = true)]
//[assembly: TestFramework("Xunit.Extensions.Ordering.TestFramework", "Xunit.Extensions.Ordering")]
[assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")]
[assembly: TestCollectionOrderer("Xunit.Extensions.Ordering.CollectionOrderer", "Xunit.Extensions.Ordering")]

using Xunit;using Xunit.Extensions.Ordering;[assembly: CollectionBehavior(DisableTestParallelization = true)]//[assembly: TestFramework("Xunit.Extensions.Ordering.TestFramework", "Xunit.Extensions.Ordering")][assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")][assembly: TestCollectionOrderer("Xunit.Extensions.Ordering.CollectionOrderer", "Xunit.Extensions.Ordering")]

6.运行测试项目:

在vs中运行测试项目中右键可以看到运行和调试测试项目运行比较简单,如果在服务器上需要使用dotnet test运行测试,注意配置文件要与服务器的匹配,将项目整体目录拷贝到服务器,cd 到测试项目目录下执行 dotnet test,有多少个接口瞬间测试完毕,而且在项目后续迭代更新的时候,只需要执行以下就可以测试所有的接口。

到此,相信大家对“Net6 Xunit集成测试问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Net6 Xunit集成测试问题怎么解决

本文链接: https://lsjlt.com/news/330055.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Net6 Xunit集成测试问题怎么解决
    本篇内容主要讲解“Net6 Xunit集成测试问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Net6 Xunit集成测试问题怎么解决”吧!1.新建测试项目2.使用...
    99+
    2023-06-30
  • 关于Net6 Xunit 集成测试的问题
    目录1.新建测试项目2.使用到的类库3.注入4.创建测试类测试方法:5.排序执行测试方法:6.运行测试项目:对于单元测试、集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去...
    99+
    2024-04-02
  • springboot集成测试容器重启问题的处理
    目录背景测试用例的运行流程结论背景 spring boot test的项目中常用的测试框架, 最近在写集成测试的时候发现一个比较奇怪的问题,当我在运行多个测试用例的时候会偶尔重新启动...
    99+
    2024-04-02
  • Java中怎么实现单元测试与集成测试
    Java中怎么实现单元测试与集成测试,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Maven测试代码结构的组织我们知道在Maven工程结构中“src/test”目录是专门用...
    99+
    2023-06-16
  • spring单元测试重复加载问题怎么解决
    在Spring单元测试中,可能会遇到重复加载的问题,即同一个bean被加载了多次。这可能会导致测试结果不准确或出现其他异常。以下是一...
    99+
    2023-08-31
    spring
  • 如何解决Web应用集成问题
    今天就跟大家聊聊有关如何解决Web应用集成问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。2台机器部署了2个Web应用,A应用需要访问B应用的UR...
    99+
    2024-04-02
  • 解决springcloud集成nacos遇到的问题
    目录背景组件版本分析解决步骤第一步:总结:背景 最近在搭建微服务框架,在搭建gateway 的时候 使用nacos做注册中心,在通过网关调用的时候发下一个奇怪的问题,网关可以路由ht...
    99+
    2023-05-15
    springcloud集成nacos springcloud nacos
  • mysql连接测试不成功怎么解决
    首先,请确保您的MySQL服务已启动,并且端口号正确。如果您的MySQL连接测试不成功,可以尝试以下步骤来解决问题:1. 检查用户名...
    99+
    2023-08-30
    mysql
  • mysql5.5字符集问题怎么解决
    本篇内容介绍了“mysql5.5字符集问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装了个5...
    99+
    2024-04-02
  • 解决springboot 2.x集成log4j2调试日志无法关闭的问题
    springboot2.x集成log4j2时,始终无法关闭log4j2自身的日志输出 已经做了如下配置: 在log4j2.xml的配置文件中,配置configuration的stat...
    99+
    2024-04-02
  • redis集群怎么解决脑裂问题
    redis集群怎么解决脑裂问题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是redis的集群脑裂?redis的集群脑裂是指因为网络问...
    99+
    2024-04-02
  • ArrayList集合容器问题怎么解决
    本篇内容主要讲解“ArrayList集合容器问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ArrayList集合容器问题怎么解决”吧!ArrayList 踩坑首先大家看看这段代码有什...
    99+
    2023-06-16
  • 解决Jenkins集成SonarQube遇到的报错问题
    Jenkins集成Sonar过程中遇到的报错 1、jenkins中无法添加sonarqube的token凭证 因为添加的凭证类型错误,所以无法添加token,类型应该选择“Secre...
    99+
    2024-04-02
  • SpringBoot集成redis错误问题及解决方法
    目录一、错误信息 二、软件版本三、基本信息五、其他信息描述:SpingBoot 集成Reids (本机连接虚拟机Redis服务)出现错误 哇咔咔 当你距离成功只有一步的时候...
    99+
    2024-04-02
  • Spring Boot集成Seata怎样解决分布式事务问题
    Spring Boot集成Seata怎样解决分布式事务问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。seata 简介Seata 是 阿里巴巴2019年开源的分布式事务解...
    99+
    2023-06-05
  • Docker Swarm在持续集成测试中怎么应用
    这篇文章主要介绍了Docker Swarm在持续集成测试中怎么应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker Swarm在持续集成测试中怎么应用文章都会有所收获...
    99+
    2024-04-02
  • MongoDB怎么检测和解决死锁问题
    在MongoDB中,死锁问题通常是由于并发操作导致的,解决死锁问题通常需要对数据库的设计和应用程序的并发控制进行优化。 以下是一些检...
    99+
    2024-04-19
    MongoDB
  • redis集群多机房问题怎么解决
    解决Redis集群跨多个机房的问题可以采取以下几种方式:1. 多个机房内部各自部署独立的Redis集群:在每个机房内部独立部署Red...
    99+
    2023-09-06
    redis
  • redis集群调用incr问题怎么解决
    在Redis集群中,调用incr命令可能会遇到以下问题: 在Redis集群中,每个节点只负责一部分数据的存储,当调用incr命令时...
    99+
    2023-10-25
    redis
  • MySQL字符集编码问题怎么解决
    本文小编为大家详细介绍“MySQL字符集编码问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL字符集编码问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方法1:在创建数据库时,指定字...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作