如何隐藏C#单元测试?

时间:2015-09-01 07:35:14

标签: c# visual-studio unit-testing vstest

对于快速实验,我更喜欢使用“单元测试” -i.e。使用[TestMethod] - 注释一个(或多个)方法,而不是使用Main方法创建一个小项目。

测试方法比小项目有一些优势:

  • 编写方法并使用[TestMethod]注释它比创建新项目更快;
  • 测试方法可以使用the visual studio test tools提供的设施,例如与类似实验共享的测试装置(通过[TestInitialize]);
  • 该方法可以通过右键单击并选择“运行测试”来执行(在visual studio 2015中); 和,
  • 使用Assert()代替通过调试器检查值或通过Console.WriteLine()自动记录实验的意图和结果,并使其可重复,无需人工干预。

问题是这些实验出现在视觉工作室测试资源管理器中,这会导致混乱,并且难以将实际单元测试与实验区分开来。 (我没有使用任何其他测试报告工具,CI等,但我认为问题也会在那里发生。)

有没有办法利用[TestMethod]进行实验并避免同时造成的混乱?

我尝试了以下方法来解决这个问题:

  • [TestClass][TestMethod]属性作为注释,并在您想要运行实验时取消注释。

    这就是我目前所做的。它有效,但运行实验有点麻烦。

  • 使用[Ignore]属性。

    使用忽略的测试将测试资源管理器视图混乱,并要求注释掉[Ignore]属性以运行测试。

  • 将实验放在不同的项目中;根据{{​​3}}的建议,或使用Veverke建议的[TestCategory]属性对测试进行注释。

    视觉工作室测试资源管理器可以按类别,持续时间,结果,特征,项目对测试进行分组。为了避免混乱:选择 traits 可以保持注释C Sharper关闭的测试树,或者选择项目,可以保持“experiments.proj”树的关闭状态。

    使用分组将实验与测试区分开来时,不能使用测试资源管理器中的其他分组。

TL; DR

如何在没有实验的情况下编写实验(使用视觉工作室单元测试),使实际单元测试的报告变得混乱?

3 个答案:

答案 0 :(得分:3)

结合答案:

  1. 真的想要滥用单元测试作为实验吗? Jamie Rees评论和answer C Sharper评论

    也许Linqpad([https://www.linqpad.net/])或类似的东西更适合实验。

  2. 如果您想滥用单元测试,请使用[TestCategory]标记每个实验方法。这允许在测试资源管理器中对实验进行分组,并选择要运行的测试。(来自answer来自C Sharper

  3. 使用构建配置来定义条件编译符号,例如EXPERIMENTS。使用#if EXPERIMENTS启用或停用实验。使用解决方案构建配置可以从工具栏启用或禁用实验。(来自answer Kasper van den Berg

  4. 示例:

    #if EXPERIMENTS
    [TestClass]
    public class MyExperiment1
    {
        [TestMethod, TestCategory("Experiment")]
        public void Method1()
        {
            …
        }
    }
    #endif
    

答案 1 :(得分:2)

基本上,您滥用单元测试以获取其无意的内容。 但是我想到的唯一解决方案是使用[TestCategory]属性来控制测试运行的时间以及应该在哪个列表中。

[TestMethod(), TestCategory("Nightly"), TestCategory("Weekly"), TestCategory("ShoppingCart")]
public void DebitTest()
{

}

答案 2 :(得分:1)

可以通过ifdef禁用实验,例如:

#if EXPERIMENTS
[TestClass]
public class MyExperiment1
{
    [TestMethod]
    public void Method1()
    {
        …
    }
}
#endif

要启用实验,请将#define EXPERMIMENTS添加为文件的第一行;然而,这仍然很麻烦。条件编译符号(EXPERIMENTS)也可以通过项目属性定义。要改进这一点,请创建构建配置和解决方案配置,并仅为构建配置定义条件编译符号。