2015-06-11 59 views
7

我目前正在通過visual studio運行測試。在所有測試運行之前,我會自動創建一組具有已知憑證的用戶,並在運行結束時刪除這些用戶。但是,有時我需要中途取消我的測試。在這些情況下,測試永遠沒有機會進行清理,這意味着測試運行中會留下假用戶信息,並可能導致下一次測試運行崩潰(當它試圖將用戶信息添加到數據庫時)。無論如何,即使測試被取消,強制visual studio/mstest運行清理方法嗎?取消測試後清理

我知道一個選項是進行測試檢查並確保用戶信息不存在,並且在創建新用戶之前刪除它。但是這仍然不能解決取消的測試運行中留下不需要的測試數據的問題。

更新:

很抱歉的誤解,但是在測試開始清理數據是不是一種選擇。我對這個問題給出了一個非常簡單的觀點,但簡單地說,我沒有簡單的方法來確保在測試開始時不存在測試數據。所有清理工作必須在測試結束時進行。

+1

我想訂閱當你取消或當它完成自然,而在此情況做清理 – bill

+1

如果你在測試之前進行清理運行觸發事件處理程序? – Matthew

+0

爲什麼不能在測試前刪除數據?它是你唯一的選擇,從調試器取消測試會停止所有執行 –

回答

5

在創建數據之前執行清理操作,這將確保您不會發生任何殘留數據。當然,這隻有在運行安裝程序之前識別任何剩餘數據的情況下才有可能。

7

我不是在測試結束時調用清理函數,而是在每次測試開始時調用我的函數來解決這個確切問題。

3

我想你應該在測試之前打開一個事務,創建數據並完成測試測試。但不要交易。這將確保測試不會影響您的數據庫。

+0

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/評論/低質量帖子/ 17989174) – manish

+0

仍然不知道爲什麼問題得到的投票沒有任何評論解釋爲什麼。我的問題的解決方案是將事務中的所有內容都包含在事務中,這可以防止將測試數據保存到數據庫。仍然不知道爲什麼它不提供答案。 –

+0

您描述的OP不能以乾淨的方式回滾事務。根據我的經驗,連接池的連接在應用程序進程停止後仍可能掛起一段時間。在這種情況下交易是否仍然在運行並持有鎖定? –

2

因此Visual studio使用NUNIT,你可以使用TearDownAttribute。測試結束後應該運行,即使測試被取消。你可以寫一個函數來清理你的數據。

請點擊這裏閱讀參考文檔:http://nunit.org/docs/2.2/teardown.html

+0

請不要用「U」縮寫「你」。 StackOverflow旨在儘可能地保持專業和國際化。雖然可能很容易理解,但來自印尼的非母語人士可能會遇到問題。 –

+0

謝謝MechMK1。 – Shuvra

2

只是爲了澄清更多關於NUNIT standrad。請按照測試類中的步驟:

[TestFixture] 
public class _TestClass 
{ 
     [TestFixtureSetUp] 
     public void Setup() 
     { 
      //Clearup can be here before start of the tests. But not Recommended 
     } 

     [Test] 
     public void _Test1() 
     { 
     } 
     [Test] 
     public void _Test2() 
     { 
     } 

     [TestFixtureTearDown] 
     public void CleanUp() 
     { 
      //I will recommend to clean up after all the tests complete 
     } 
} 

參考:http://nunit.org/docs/2.5/fixtureTeardown.html

7

那是不可能的。您最好找到一種替代解決方案,如使用單獨的數據庫進行測試,並在每次測試運行前清理所有數據,使用固定的測試用戶集合或用一些標記標記測試數據。檢查Isolating database data in integration tests Jimmy Bogard的文章。

沒有內置的方法來更改MSTest默認行爲。從理論上講,您可以編寫使用TestExecution.OnTestStopping事件的MSTest擴展,但這不是一個簡單的過程,它需要註冊表更改。而且,很多人抱怨說它不起作用。

還有MSTest V2,帶有新的可擴展性點的MSTest的新版本。但是看起來你不能用這個點改變取消行爲,只寫屬性修飾符。見Extending MSTest V2

您不能使用AppDomain.CurrentDomain.ProcessExitProcess.GetCurrentProcess().Exited事件,因爲取消似乎會終止測試運行過程。

NUnit目前也不支持此功能。請參閱相關的NUnit測試適配器Run TearDowns on VS Cancel Test Run問題。

+0

感謝大家所有的新答案。很明顯,有些人在特定情況下工作得很好,而不是在其他情況下工作。對於我目前的情況,這個答案與我目前需要的最接近。 –

3

有兩種情況我們需要考慮在ATP中分配資源(資源可能是創建用戶,連接數據庫)。他們是

  • 每次測試後創建和刪除資源。
  • 在一組測試後創建和刪除資源。

資源的創建和刪除每次測試後:

如果我們想的一個測試執行之前創建特定對象的實例,並要清理執行後,分配給該對象的內存那測試,那麼我們使用NUnit的Test SetUpTest TearDown屬性。在你的案例中,對象是用戶數量的創建。

[SetUp]:該函數裝飾有測試設置屬性包含一段代碼的任何測試執行之前執行。

[TearDown]:該函數裝飾有測試TearDown中屬性包含一段代碼,任何測試的執行之後執行

實現:

[TestClass] 
    public class UnitTest1 
    { 
     [SetUp] 
     public void SetUP() 
     { 
      // Creating Users with proper credentials 
     } 

     [TestMethod] 
     public void TestMethod1() 
     { 
      //Write your ATP 
     } 

     [TearDown] 
     public void TearDown() 
     { 
      //Clean up 
     } 
    } 

創作和資源的刪除組測試後:

現在,如果我們想創建一個對象的實例爲測試集,並且希望在執行所有測試後清理內存,然後分別清理內存和[TestFixtureSetUp][TestFixureTearDown]以清理內存。再次在您的案例對象可以創建一組用戶。

[TestFixtureSetUp]:用TestFixtureSetUp裝飾的功能將執行一次之前執行測試組的執行。

[TestFixtureTearDown]:用TestFixtureTearDown裝飾的功能將執行一次執行一組測試。

實施

[TestFixture] 
public class Tests 
{ 
     [TestFixtureSetUp] 
     public void Setup() 
     { 
      //Create users with credentials 
     } 

     [Test] 
     public void _Test1() 
     { 
      //Test_1 
     } 
     [Test] 
     public void _Test2() 
     { 
     //Test2 
     } 

     [TestFixtureTearDown] 
     public void CleanUp() 
     { 
      //Cleanup; Here you need to add code to Delete all users 
     } 
} 

注:我會建議你,如果你想創建和刪除用戶特定ATP然後用SetUpTearDown去。如果您嘗試使用相同的一堆ATP,我會建議您使用TestFixtureSetUpTestFixtureTearDown

「如果你的測試獲得通過或失敗,安裝和拆卸功能將執行」

參考文獻:

4

的想法是,在測試開始之前一個交易被初始化。爲了將數據保存到數據庫中,事務必須被提交,但它不會被提交。在測試停止的情況下,如果測試成功或不成功完成,它就起作用。

在集成測試,我們使用的財產以後像這樣(NUnit的)(它真正的生產代碼)

public class RollbackAttribute : TestAttribute, ITestAction 
{ 
    private TransactionScope _transaction; 

    public void BeforeTest(ITest test) 
    { 
     _transaction = new TransactionScope(); 
    } 

    public void AfterTest(ITest test) 
    { 
     _transaction.Dispose(); 
    } 

    public ActionTargets Targets => ActionTargets.Test; 
} 

[TestFixture] 
public class SomeTestClass 
{ 
    [Rollback] //No need [Test] because Rollback is inherit it. 
    public void SomeTestMethod() 
    { 
    } 
} 

在MSTEST可以使財產以後類似的,但在這種情況下,你應該從基類繼承,我希望有用。例如:

public class RollbackTestBase 
{ 
    private TransactionScope _transaction; 

    [TestInitialize] 
    public virtual void Setup() 
    { 
     _transaction = new TransactionScope(); 
    } 


    [TestCleanup] 
    public virtual void TearDown() 
    { 
     _transaction.Dispose(); 
    } 
} 

[TestClass] 
public class IntegrationTest : RollbackTestBase 
{ 
    [TestMethod] 
    public void TestDataBase() 
    { 
     Assert.IsTrue(true); 
    } 

    [TestInitialize] 
    public virtual void Init() 
    { 
    } 

    [TestCleanup] 
    public virtual void CleanUp() 
    { 
    } 
}