返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >关于Net6 Xunit 集成测试的问题
  • 519
分享到

关于Net6 Xunit 集成测试的问题

2024-04-02 19:04:59 519人浏览 独家记忆
摘要

目录1.新建测试项目2.使用到的类库3.注入4.创建测试类测试方法:5.排序执行测试方法:6.运行测试项目:对于单元测试、集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去

对于单元测试、集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去开发,做完项目模块直接postman 调用测试(当然这是一个选择,开发也中经常用到),但是如果测试需要多样化数据,各种场景模拟这样postman测试就暴露了他的局限性,下面我将Net6下没有使用Startup以及NET6以前版本使用Startup的集成测试(单元测试雷同)做一个梳理

1.新建测试项目

2.使用到的类库

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

Xunit.DependencyInjection 这是一个测试注入的扩展:GitHub地址:https://github.com/pengweiqhca/Xunit.DependencyInjection

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

3.注入

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

3.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));
        }
    }

3.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 集成测试的文章就介绍到这了,更多相关Net6 Xunit 集成测试内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于Net6 Xunit 集成测试的问题

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

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

猜你喜欢
  • 关于Net6 Xunit 集成测试的问题
    目录1.新建测试项目2.使用到的类库3.注入4.创建测试类测试方法:5.排序执行测试方法:6.运行测试项目:对于单元测试、集成测试大部分开发的朋友都懒得去写,因为这要耗费精力去设计去...
    99+
    2024-04-02
  • Net6 Xunit集成测试问题怎么解决
    本篇内容主要讲解“Net6 Xunit集成测试问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Net6 Xunit集成测试问题怎么解决”吧!1.新建测试项目2.使用...
    99+
    2023-06-30
  • 关于springcloud集成nacos遇到的问题
    目录springcloud集成nacos遇到的问题1.获取不到配置文件信息2.springcloud 服务注册不上服务列表springcloud无法注册Nacos这是官方推荐一起使用...
    99+
    2024-04-02
  • 关于python实现requests接口测试的问题
    requests接口测试的介绍 requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests是Python语言的第三方的...
    99+
    2024-04-02
  • springboot集成测试容器重启问题的处理
    目录背景测试用例的运行流程结论背景 spring boot test的项目中常用的测试框架, 最近在写集成测试的时候发现一个比较奇怪的问题,当我在运行多个测试用例的时候会偶尔重新启动...
    99+
    2024-04-02
  • 关于springboot集成swagger及knife4j的增强问题
    参考链接:狂神的Swagger笔记 号称世界上最流行的API框架 Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新 直接运行...
    99+
    2024-04-02
  • 关于springboot集成阿里云短信的问题
    目录1.获取签名与模板2.编写模板与签名的枚举类3.配置类4.测试类​ 1.获取签名与模板 进入阿里云平台,进入短信服务模块,在以下位置添加签名和模板(格式一定按照要求填写 审批的比...
    99+
    2024-04-02
  • 关于springboot集成swagger3时spring-plugin-core报错的问题
    springboot集成knife4j的时候3.0.2版本出现了以下问题: An attempt was made to call a method that does not e...
    99+
    2024-04-02
  • 有哪些关于Java集合的面试题
    本篇内容主要讲解“有哪些关于Java集合的面试题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些关于Java集合的面试题”吧!HashMap和HashTable有何不同?  (1)HashM...
    99+
    2023-06-02
  • Golang 函数测试中的集成测试技巧
    在 go 语言中,集成测试用于模拟外部依赖项以测试函数。利用 ginkgo 和 gomega,可以执行以下集成测试:测试外部 api 调用,模拟 http.get 函数并验证响应。测试数...
    99+
    2024-04-16
    golang 集成测试 git
  • Angular中关于单元测试的面试题有哪些
    这篇文章主要介绍了Angular中关于单元测试的面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular中的测试有哪些种,基于哪些测试框架Angular的测试...
    99+
    2023-06-15
  • 关于maven环境的安装及maven集成idea环境的问题
    目录什么是maven,有什么用?1.下载2.安装3.修改maven仓库3.1修改本地仓库3.2 配置私服 4.idea配置maven什么是maven,有什...
    99+
    2024-04-02
  • PHP中的单元测试和集成测试指南
    随着软件开发的不断发展,测试已经成为保证软件质量的必要步骤。而随着PHP语言的广泛应用,PHP开发中的单元测试和集成测试也愈发重要。在本篇文章中,我们将会探讨以下主题:什么是单元测试和集成测试单元测试和集成测试的优势PHPUnitPHPUn...
    99+
    2023-05-21
    PHP 单元测试 集成测试
  • spring boot集成测试的方法
    这篇文章主要介绍“spring boot集成测试的方法”,在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spri...
    99+
    2024-04-02
  • PHP中的测试集成工具
    PHP是一种流行的服务器端脚本语言,广泛应用于Web开发中。由于PHP的开源特性和灵活性,它在快速开发和维护大型Web应用程序方面得到了广泛认可。测试对于Web应用程序的开发和部署至关重要,因为它可以确保应用程序在各种情况下具有稳定和一致的...
    99+
    2023-05-23
    集成 PHP 测试工具
  • Yii框架的测试武器库:单元测试、功能测试和集成测试
    范围:单元测试关注代码的特定部分,而不考虑外部依赖关系。它们验证代码的行为是否符合预期,并覆盖所有代码路径。 优点: 快速执行 容易维护 可以自动化并集成到持续集成管道中 缺点: 无法测试代码的依赖关系集成 覆盖面可能不全面,可能遗...
    99+
    2024-04-02
  • 关于PostgreSQL JSONB的匹配和交集问题
    PostgreSQL 自从支持 JSONB 到现在,已经有十余年,这十多年来,社区为 JSONB 提供了很多强大的功能。就我个人而言,其实最常用的还是匹配操作 @>&...
    99+
    2024-04-02
  • 单元测试与集成测试在golang函数测试中的区别?
    单元测试和集成测试是两种不同的 go 函数测试类型,分别用于验证单个函数或多个函数的交互和集成。单元测试只测试特定函数的基本功能,集成测试测试多个函数之间的交互和与应用程序其他部分的集成...
    99+
    2024-04-27
    单元测试 集成测试 golang
  • 总结几道关于Node.js的面试问题
    什么是error-first的回调方式 Error-first回调方式用来同时传递error和data。将错误作为第一个参数,它就必须先检查看看有没有错误先。另外的参数就用来传递data了。 fs.re...
    99+
    2022-06-04
    几道 Node js
  • 关于Python的面试问答题有哪些
    这篇文章主要介绍“关于Python的面试问答题有哪些”,在日常操作中,相信很多人在关于Python的面试问答题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”关于Python的面试问答题有哪些”的疑惑有所...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作