单元测试在调试时通过,但在运行时失败

Pon*_*nes 4 c# testing debugging unit-testing

搜索方法返回任何匹配的文章和最新的非匹配文章,直到指定的数字.

在返回之前,匹配文章的IsMatch属性设置为true,如下所示:

articles = matchingArticles.Select(c => {c.IsMatch = true; return 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在调试中运行测试时,所有断言都会通过,但是在发布中运行测试时,最终断言会失败:

预期:真实但是:是的

在应用程序本身,响应是正确的.

关于为什么会发生这种情况的任何想法?

编辑:

我弄清楚问题是什么.这基本上是一种竞争条件.当我设置测试时,我正在删除db表,重新创建它并用测试数据填充它.由于搜索依赖于全文搜索,因此我在相关列上创建文本索引并将其设置为自动填充.当在调试中运行时,似乎有足够的时间来填充文本索引,并且搜索查询返回匹配项.当我运行测试时,我不认为索引已经及时填充,没有返回匹配并且测试失败.它与日期时间问题类似.如果我在创建目录和运行测试之间设置延迟,则测试通过.

wal*_*wal 7

Pones,你已经澄清了单元测试在不调试时失败了.

在这个阶段它可能是任何东西但是你应该继续运行单元测试而不是调试并在你知道的某个地方插入以下语句(或者你认为你知道)是真的

 if(condition)
            Debugger.Launch();
Run Code Online (Sandbox Code Playgroud)

这将显而易见,并允许你区分什么是错误的.我推荐的1个地方IsMatch(适合初学者)

你可以遇到这样的问题的另一个常见的地方是使用DateTime.如果您的单元测试运行"太快",那么它可能会打破您的假设.

  • 我弄清楚问题是什么.这基本上是一种竞争条件.当我设置测试时,我正在删除db表,重新创建它并用测试数据填充它.由于搜索依赖于全文搜索,因此我在相关列上创建文本索引并将其设置为自动填充.当在调试中运行时,似乎有足够的时间来填充文本索引,并且搜索查询返回匹配项.当我运行测试时,我不认为索引已经及时填充,没有返回匹配并且测试失败.它与日期时间问题相似. (3认同)

Ete*_*l21 5

显然,这个问题对于其他用户来说会有所不同,但我刚刚解决了这个问题,并认为我的解决方案可能会有所帮助。基本上,当您在调试模式下运行时,您仅运行一个测试。当您在运行模式下运行时,除了您遇到问题的测试之外,您还正在运行多个测试。

在我的情况下,问题是那些写入全局列表的其他测试,我在测试设置中没有明确清除该列表。我通过在测试开始时清除列表来解决该问题。

我的建议是,看看这是否是您面临的问题类型,即禁用所有其他测试,只“运行”您有问题的测试。如果它在单独运行时有效,但与其他程序一起运行则无效,那么您就会知道测试之间存在一些依赖性。

Console.WriteLine("test")另一个技巧是在测试中使用语句。这实际上就是我发现我的列表中包含另一次测试剩余的项目的方式。