繁体   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