2016-04-21 88 views
3

情况:我的一些集成测试类共享通用方法来设置数据库中的场景,因此我提供了一个抽象基类。它也负责一个完整的数据清理,在结束后所有测试跑:每个测试类多个ClassCleanup属性

public abstract class IntegrationTests 
{ 
    ... 
    protected static void Cleanup() { ... } 
} 

我的继承类必须调用基方法,以确保我的基地清理代码运行:

[TestClass] 
public class FooIntegrationTests : IntegrationTests 
{ 
    ... 

    [ClassCleanup] 
    public static void FooCleanup() 
    { 
     ... 
     Cleanup(); 
    } 
} 

问题:据MSDN“[O]在一个类可以与[ClassCleanup]装饰NLY一个方法属性”所以我不能从基类装饰Cleanup方法,即使我做的方法将不会被弄调用。

问题:我想这

  • 始终运行从基类的Cleanup方法,而不在继承的类实现什么,解决
  • 始终运行在自定义清理方法如果有的话,继承测试类。

我不喜欢强制继承测试类显式调用基类,因为我必须记得实现它。我更喜欢更优雅但简单的(!)技术。有任何想法吗?

注意:为我的基地功能的单是由所有的测试类共享不起作用,因为我对所有连接到同一个数据库实例并行多个测试代理运行我的测试。

+0

“ClassCleanup”属性只能分配给静态方法。 'virtual'和'override'关键字只能用于实例方法。 –

+0

啊,对,我正在考虑通常的安装/拆卸。道歉。 –

+0

静态方法/类打破了正常的继承规则。所以不,我不确定除了从继承类中调用Cleanup以外,你可以在这里做很多事情。 –

回答

0

把我的回答放在评论中,在那里调用ClassCleanup不再起作用。

我做这一切的时候,我的工作。你所需要做的就是将基类作为一个测试类,并且在那里“花费”你的清理和拆卸属性。如果你需要清理/拆卸在派生类中,只要在需要的时候,你可以ovveride虚方法:

[TestClass] 
public abstract class BaseIntegrationTest 
{ 
    [TestInitialize] 
    public void BeforeEach() { 
     // Stuff that should happen before each unit test 

     BaseTestInitialize(); 
    } 

    [TestCleanup] 
    public void AfterEach(){ 
     // Stuff that should happen after each unit test 

     BaseTestCleanup(); 
    } 

    public virtual void BaseTestInitialize() { } 
    public virtual void BaseTestCleanup() { } 
} 

有了这个结构,你在你的集成测试做的是覆盖BaseTestCleanup ()):

[TestClass] 
public class DerivedTestClass : BaseIngetrationTest 
{ 
    public override void BaseTestCleanup() 
    { 
     // Derived cleanup 
     base.BaseTestCleanup(); 
    } 


    [TestMethod] 
    public void SomeMethod_SomeCriteria_SomeResult() 
    { 
     // Arrange 

     // Act 

     // Assert 
    } 
} 
+0

如果您需要为每个测试进行初始化和/或清理,这是一个好主意。不幸的是,这种方法会导致严重的性能问题,为*集成*测试:建立和清理数据方案正在紧张运行此数十或数百每班时间是太贵了。 –

+0

我通常会使用testcategory标记我的集成测试,因此它们只能在晚上运行,当然也可以在有人正在使用它们时运行。我从来没有在我的持续集成中做任何类型的IO(包括磁盘)的测试。 –

+0

我们也这样做:集成测试每天只运行两次,并根据要求运行。但是,数据设置可能花费很多秒 - 测试套件将运行数小时,因此我们必须重新创建并删除每个测试的场景。 –