簡體   English   中英

單元測試在調試時通過但在運行時失敗

[英]Unit test passes when in debug but fails when run

搜索方法返回任何匹配的文章和不超過指定數量的最近的非匹配文章。

在返回之前,匹配文章的 IsMatch 屬性設置為 true,如下所示:

文章 = matchingArticles.Select(c => { c.IsMatch = true; 返回 c; }).ToList();

在對該方法的測試中,

    [Test]
    public void SearchForArticle1Returns1MatchingArticleFirstInTheList()
    {
        using (var session = _sessionFactory.OpenSession())
        {
            var maxResults = 10;
            var searchPhrase = "Article1";
            IArticleRepository articleRepository = new ArticleRepository(session);
            var articles = articleRepository.GetSearchResultSet(searchPhrase, maxResults);
            Assert.AreEqual(10, articles.Count);
            Assert.AreEqual(1, articles.Where(a => a.Title.Contains(searchPhrase)).Count());
            var article = articles[0];
            Assert.IsTrue(article.Title.Contains(searchPhrase));
            Assert.IsTrue(article.IsMatch);
        }
    }

當測試在調試中運行時,所有斷言都會通過,但是當測試在發布中運行時,最終斷言會失敗:

預期:正確但是是:錯誤

在應用程序本身中,響應是正確的。

關於為什么會發生這種情況的任何想法?

編輯:

我想出了問題是什么。 這本質上是一種競爭條件。 當我設置測試時,我刪除了數據庫表,重新創建它並用測試數據填充它。 由於搜索依賴於全文搜索,因此我在相關列上創建了一個文本索引並將其設置為自動填充。 當這在調試中運行時,似乎有足夠的時間來填充文本索引並且搜索查詢返回匹配項。 當我運行測試時,我認為索引沒有及時填充,沒有返回任何匹配項並且測試失敗。 它類似於日期時間問題。 如果我在創建目錄和運行測試之間設置延遲,則測試通過。

Pones,你后來澄清了單元測試在不調試時失敗。

在這個階段它可以是任何東西但是你應該繼續運行單元測試而不是調試並在你知道(或認為你知道)的地方插入以下語句是真的

 if(condition)
            Debugger.Launch();

這將起到顯而易見的作用,並讓您了解發生了什么問題。 1 我建議的地方是IsMatch屬性(對於初學者)

另一個可能遇到此類問題的常見地方是使用 DateTime。 如果您的單元測試運行“太快”,那么它可能會打破您的假設。

嘗試print out您正在將它們與debugnormal run時的預期進行比較的實際結果

就我而言,我in the test method I created entities (JBA)

debug模式下, generated ids為 1、2 和 3

但在normal running模式下,它們是different

這導致我的hard-coded值使測試失敗,所以我將它們更改為從實體而不是硬編碼方式獲取 id

希望這可以幫助

顯然,其他用戶的問題會有所不同,但我剛剛解決了這個問題,並認為我的解決方案可能會有所幫助。 基本上,當您在調試模式下運行時,您只會運行一個測試。 當您在運行模式下運行時,除了遇到問題的測試之外,您還在運行多項測試。

在我的情況下,問題是那些寫入全局列表的其他測試我沒有在我的測試設置中明確清除。 我通過在測試開始時清除列表來解決這個問題。

我的建議是,看看這是否是您面臨的問題類型,即禁用所有其他測試,只“運行”您遇到問題的測試。 如果它在單獨運行時有效,但與其他程序一起運行時無效,您就會知道測試之間存在某種依賴性。

另一個技巧是在測試中使用Console.WriteLine("test")語句。 實際上,這就是我發現我的列表中有其他測試遺留下來的項目的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM