如何在执行单元测试之前确定其名称?

时间:2011-07-03 20:20:07

标签: unit-testing nunit mstest

我正在使用MSTest,一切都很好。不久前,我需要编写大量的数据驱动单元测试。

此外,我需要在运行之前知道测试的名称,因此我可以使用正确的参数(从外部远程服务获取)填充数据源。

在MSTest中没有任何地方可以找到一种方法来获取即将在实际执行之前运行的测试的名称。在这一点上,它当然已经太晚了,因为已经填充了数据源。

我需要知道即将执行的测试的名称,以便我可以在执行之前提前配置他们的数据源。

有人建议我“查看NUnit”。我完全不了解NUnit。现在我已经开始阅读其文档,但仍然不知所措。你有什么建议吗?

3 个答案:

答案 0 :(得分:1)

如果你真的需要测试的名字 - 它没有很好的文档记录,但NUnit公开了一个功能,让你可以访问当前的测试信息:

namespace NUnitOutput.Example
{
  using NUnit.Framework;

  [TestFixture]
  public class Demo
  {
      [Test]
      public void WhatsMyName()
      {
          Console.WriteLine(TestContext.CurrentContext.Test.FullName);
          Console.WriteLine(TestContext.CurrentContext.Test.Name);
      }
  }
}

提供:

NUnitOutput.Example.Demo.WhatsMyName
WhatsMyName

请注意,此功能无法保证由自定义TestRunner(如ReSharper)实现。我在NUnit 2.5.9(nunit.exe和nunit-console.exe)

中对此进行了测试

但是,重新阅读我认为您应该查看的问题是 TestCaseSource TestCase 属性,可用于参数化你的考试。

答案 1 :(得分:0)

如果我正确理解您的问题,您希望获取当前正在运行的测试的名称,以便您可以将其用作查找一组数据的密钥,以便填充数据源所使用的数据源。正在测试的代码。是对的吗?

如果是这种情况,那么我认为您不需要在单元测试框架中寻找特殊功能。为什么不使用Reflection API来获取当前正在执行的方法的名称? System.Reflection.MethodBase.GetCurrentMethod()会为您提供一个代表该方法的MethodBase对象,并且该属性具有Name属性。

但是,我建议使用方法名作为查找相应测试数据的关键是一个坏主意。您将方法的名称与数据集耦合,这似乎是我的脆弱代码的一个秘诀。您需要保持自由地重构您的代码和方法的名称,而不必担心这是否会破坏幕后的数据库查找。

作为替代方案,为什么不考虑creating a custom Attribute可以用来标记那些需要数据库查找的测试方法,并使用该属性的属性来保存密钥?

答案 2 :(得分:0)

对于这样的事情,您应该依靠 fixture来在运行测试之前初始化您想要的状态

在(任何)测试框架中工作的最简单方法是创建一个加载任何给定数据标识符的数据的夹具(字符串)。然后在每个测试用例中,您只需提供测试字符串,以便在该测试中查找所需数据的数据。

除此之外,不建议让单元测试访问文件和其他外部资源,因为这意味着更慢的单元测试和更高的失败概率(因为你依赖于内存代码之外的东西)。这当然取决于您拥有的数据量和您正在进行的测试类型,但我通常会将数据编译为单元测试。