我正在NUnit中设置测试并遇到一个新手问题。
是否有可能在多个[TestFixture]中使用的测试?
所以 [Test] ValidateString(string bob)
可以在一系列不同的[TestFixture]中调用吗?
答案 0 :(得分:5)
这听起来不像是对我的考验。测试通常是无参数的(除非您使用[TestCase]
s)并且在单个夹具的上下文中运行它通常就足够了 - 它要么经过一次又要好,要么没有,这是一个破坏的测试
如果您只有一个对字符串进行某些验证的方法,您可以将其设置为某个类(例如TestHelpers
)上的静态方法,并从任何测试(在多个测试装置中)调用它它
这是另一个想法:继承。您可以拥有一个包含所有测试的基础夹具,然后是从中继承的夹具,用于设置您需要的任何变量。测试将针对每个夹具运行。我不熟悉Selenium RC,但您应该能够调整下面的代码来设置各种灯具中需要的变量。
[TestFixture]
public class BaseFixtureTests
{
protected IMyClass _myClass;
[TestFixtureSetUp]
public void FixtureSetup()
{
_myClass = ConfigureMyClass();
}
protected virtual IMyClass ConfigureMyClass()
{
// fixtures that inherit from this will set up _myClass here as they see fit.
}
[Test]
public void MyClassTest1()
{
// test something about _myClass;
}
}
[TestFixture]
public class MySpecificFixture1 : BaseFixtureTests
{
protected override IMyClass ConfigureMyClass()
{
return new MySpecificMyClassImplementation();
}
}
public class MySpecificMyClassImplementation : IMyClass
{
//some implementation
}
您还可以在每个灯具中添加额外的测试,这些测试不会测试常见功能,也不需要在灯具之间重复使用。
答案 1 :(得分:2)
较新版本的NUnit支持泛型。如果您测试的内容不需要从测试代码中配置(仅创建),那么这非常适合。以下是从http://nunit.net/blogs/复制的示例:
[TestFixture(typeof(ArrayList))]
[TestFixture(typeof(List<int>))]
public class IList_Tests<TList> where TList : IList, new()
{
private IList list;
[SetUp]
public void CreateList()
{
this.list = new TList();
}
[Test]
public void CanAddToList()
{
list.Add(1); list.Add(2); list.Add(3);
Assert.AreEqual(3, list.Count);
}
}
我也使用过Anna的继承方法。对她的示例的一种可能的改进(取决于个人偏好):不要将基类标记为TestFixture,只标记子类。您标记为TestFixture的每个类都将在NUnit客户端中显示为一组测试。您可能永远不会想直接运行基类方法,因为子项提供了所有设置代码。如果从基类中删除TestFixture,则在UI中不会运行无效测试。这允许你运行所有的测试,看到所有的绿色...总是很好的感觉。
答案 2 :(得分:1)
您可以通过继承实现您想要的目标。
using NUnit.Framework;
namespace ClassLibrary1
{
[TestFixture]
public class TestFixtureBase
{
[SetUp]
public virtual void Setup()
{
// setup code here
}
[Test]
public void CommonTest1()
{
Assert.True(true);
}
[Test]
public void CommonTest2()
{
Assert.False(false);
}
}
public class MyClassTests : TestFixtureBase
{
[SetUp]
public override void Setup()
{
base.Setup();
// additional setup code
}
[Test]
public void MyClassTest1()
{
Assert.True(true);
}
}
}
答案 3 :(得分:0)
您可以编写一个从多个[Test]方法调用的方法。但我认为没有办法在多个[TestFixture]中包含相同的[Test]。
[TestFixture]
public class TestsOne{
[Test] public void TryOne(){
Helpers.ValidateString("Work?");
}
}
[TestFixture]
public class TestsTwo{
[Test] public void TryTwo(){
Helpers.ValidateString("Work?");
}
}
public static class Helpers{
public static void ValidateString(string s){
Assert.IsNotNull(s);
}
}