2011-07-03 30 views
0

我正在使用MSTest,一切都很好。不久前,我需要编写大量数据驱动的单元测试。另外,我在运行它之前需要知道测试的名称,因此我可以用正确的参数(从外部远程服务中获取)填充数据源。如何在执行之前确定单元测试的名称?

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

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

有人建议我“退房NUnit”。我对NUnit完全无能为力。目前我已经开始阅读文档,但仍然处于亏损状态。你有什么建议吗?

+0

http://www.nunit.org/index.php?p=quickStart&r=2.2.10 - 不学习理论,练习是关键 –

回答

0

如果我正确理解你的问题,你想获得当前正在运行的测试的名称,以便您可以使用它作为一个键来查找一组数据来填充数据源被测试的代码。是对的吗?

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

但是,我建议使用方法名称作为查找适当的测试数据的关键是一个坏主意。你会将方法的名称与你的数据集结合起来,这对我来说就像是一个脆弱的代码。你需要保持自由来重构你的代码和方法的名字,而不用担心这是否会破坏数据库查找的后台。

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

+0

谢谢你的答复。事实上,你去了我的意图,但事情并不是那么简单。基本上,我需要做的是根据即将运行的测试配置一个DataSource。问题是,那不仅仅是一些数据源 - 它是Ut框架的数据源。它必须填充(!)在测试执行之前(!),否则 - 我错过了整个点。 – Vitaliy

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)

然而,重新阅读你的问题,我想你应该看看是TestCaseSourceTestCase的属性,可以用于参数化您的测试。

+0

对于TestCaseSource和TestCase为+1 – Pedro

相关问题