在开发和测试阶段而不是生产阶段激活单元测试

Posted

技术标签:

【中文标题】在开发和测试阶段而不是生产阶段激活单元测试【英文标题】:Activate Unit Test in Development and Test Phase and not Production phase 【发布时间】:2021-04-05 04:16:35 【问题描述】:

目标: 单元测试方法TestMethod1只能用于开发和测试阶段。 如果在生产阶段使用,一切都会被取消或类似的。

问题: 当我尝试从 useEnvironment() 方法中删除字符串值“Development”时,代码仍然有效。

是否可以在开发和测试阶段而不是在生产阶段激活单元测试?

信息: *源码取自https://www.meziantou.net/testing-an-asp-net-core-application-using-testserver.htm *请考虑到您可能有大约 500 个单元测试。 *使用asp.net core mvc v3

谢谢!


------

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using System.Net.Http;
using System.Threading.Tasks;
using Testtest;

namespace XUnitTestProject1.Test

    /// <summary>
    /// https://www.meziantou.net/testing-an-asp-net-core-application-using-testserver.htm
    /// </summary>
    public class Tests
    
        [Fact]
        public async Task TestMethod1()
        
            var webHostBuilder =
                  new WebHostBuilder()
                        .UseEnvironment("Development") // You can set the environment you want (development, staging, production)
                        .UseStartup<Startup>(); // Startup class of your web app project

            using (var server = new TestServer(webHostBuilder))
            using (var client = server.CreateClient())
            
                string result = await client.GetStringAsync("/api/values");
                Assert.Equal("[\"value1\",\"value2\"]", result);
            
        
    


using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Testtest.Controllers

    /// <summary>
    /// ValuesController
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : Controller
    
        [HttpGet]
        public IEnumerable<string> Get()
        
            return new string[]  "value1", "value2" ;
        
    



更新:

[CustomTestsFact]
[Fact]
public async Task TestMethod2()

    using (var client = _server.CreateClient())
    
        string result = await client.GetStringAsync("/api/values");
        Assert.Equal("[\"value1\",\"value2\"]", result);
    

【问题讨论】:

【参考方案1】:

XUnit FactAttribute 具有 Skip 属性,可用于跳过方法。

您可以创建一个从 FactAttribute 派生的自定义类,并使用您的 env 变量来控制是否应该跳过该方法:

    public class CustomFactAttribute : FactAttribute
      
    public CustomTestsFactAttribute()
    
        var phaseVariable = Environment.GetEnvironmentVariable("name of your env variable");
        
        Skip = phaseVariable == "production"
            ? "Tests ignored"
            : base.Skip;
    

然后你可以用 CustomFactAttribute 标记你的方法:

   [CustomTestsFact]
    public async Task TestMethod1()
    
       //your logic
    

【讨论】:

我尝试了您的解决方案,但它不起作用 你能显示代码吗,你的意思是它不起作用,你尝试调试解决方案吗? @What'sUP 你不能编译来自@Buhhovsky 的解决方案。它与不起作用不同。原因很明显-您的测试项目中没有CustomTestsFactAttribute(根据您显示的错误)。您是否忘记复制粘贴 CustomTestsFactAttribute 类定义?另请注意,此解决方案取决于环境变量,因此您不能只是复制粘贴,您必须在 GetEnvironmentVariable 调用中使用变量名称(并在执行测试之前设置此变量值)

以上是关于在开发和测试阶段而不是生产阶段激活单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Flask之单元测试

单元测试方法以及实例

单元测试规范

软件测试按照开发阶段划分:单元测试集成测试系统测试

软件测试按照开发阶段划分:单元测试集成测试系统测试

软件测试按照开发阶段划分:单元测试集成测试系统测试