如何判断哪个TestCaseData失败(在TestCaseSource代码中)

时间:2014-11-04 09:05:34

标签: c# unit-testing testing tfs visual-studio-2013

我在VS2013上使用TFS。我在编写测试时使用TestCaseSource

[Test]
[TestCaseSource("GetExtraWifQuestionsTestData")]
public void GetExtraWifQuestionsTest(WifWillTypeQuestionsViewModel viewModel, IEnumerable<QuestionItemViewModel> expected)
{
    viewModel.GetExtraWifQuestions();
    for (int i = 0; i < expected.Count(); i++)
    {
        Assert.True(expected.ElementAt(i).Equals(viewModel.QuestionItems.ElementAt(i)));
    }
}

问题是我在GetExtraWifQuestionsTestData()中有很多测试用例,其中一些测试用例失败了。 在测试用例数据中构造的对象非常复杂,并且正在使用帮助程序生成模拟的部分数据。 (只有少数案例作为例子还有更多)

public IEnumerable<TestCaseData> GetExtraWifQuestionsTestData()
    {
        yield return
            new TestCaseData(
                new WifWillTypeQuestionsViewModel(
                    MocksHelper.WifView, 
                    new TransactionMain
                        {
                            TransactionDetailList =
                                new Collection<TransactionDetail>(
                                new[] { new TransactionDetail { DefaultQuestions = QuestionTestCaseDataHelper.WifWillTypeQuestions(), TransactionWill = new TransactionWill { IsCouple = 1L, WillTypeRecomendationResolutions = QuestionTestCaseDataHelper.WillTypeRecomendationResolutions.ToList()} } })
                        }, 
                    new QuestionControlFactory(MocksHelper.IViewFactory))
                    {
                        QuestionItems =
                            new CustomerQuestionCollection(
                            QuestionTestCaseDataHelper.WifWillTypeQuestionItemViewModelQuestionAnswerGeneratorByAnswerNullsNotAdded(true, true, null, false, false))
                    }, 
                QuestionTestCaseDataHelper.WifWillTypeQuestionItemViewModelQuestionAnswerGeneratorByAnswerNullsNotAdded(true, true, null, false, false)
                    .Concat(QuestionTestCaseDataHelper.WifWillTypeQuestionItemViewModelQuestionAnswerGeneratorByAnswer(null, null, null, null, null, null, null).Where(o => o.Question.DisplayOrder == 7)));
        yield return
            new TestCaseData(
                new WifWillTypeQuestionsViewModel(
                    MocksHelper.WifView, 
                    new TransactionMain
                        {
                            TransactionDetailList =
                                new Collection<TransactionDetail>(
                                new[] { new TransactionDetail { DefaultQuestions = QuestionTestCaseDataHelper.WifWillTypeQuestions(), TransactionWill = new TransactionWill { IsCouple = 1L, WillTypeRecomendationResolutions = QuestionTestCaseDataHelper.WillTypeRecomendationResolutions.ToList() } } })
                        }, 
                    new QuestionControlFactory(MocksHelper.IViewFactory))
                    {
                        QuestionItems =
                            new CustomerQuestionCollection(
                            QuestionTestCaseDataHelper.WifWillTypeQuestionItemViewModelQuestionAnswerGeneratorByAnswerNullsNotAdded(true, true, null, false, false, null, true))
                    },
                QuestionTestCaseDataHelper.WifWillTypeQuestionItemViewModelQuestionAnswerGeneratorByAnswerNullsNotAdded(true, true, null, false, false, null, true)
                    .Concat(QuestionTestCaseDataHelper.WifWillTypeQuestionItemViewModelQuestionAnswerGeneratorByAnswer(null, null, null, null, null, null, null, null, null).Where(o => o.Question.DisplayOrder == 8)));
}

我可以使用Unit sessions window来运行特定的测试用例失败 enter image description here 然后通过浏览堆栈跟踪,我可以找出导致错误的原因,有时它是需要更改的测试用例数据(机制按预期工作 - 测试已过时)。

但是当我需要在GetExtraWifQuestionsTestData中编辑某些TestCaseData时,我无法找到一种方法来确定哪一个确实失败了。 如何确定哪些测试用例失败?是否有任何内置机制可以执行此操作,或者是一些低功耗的“黑客”。请回答这个问题时请记住,我们不是在谈论这个具体案例,而是在使用复杂的模拟机制时如何做到这一点,并且不会立即明白哪个是哪个。

更新: ATM我正在评论所有案例,然后逐一取消注释,但这不是一种非常有效的方式。

2 个答案:

答案 0 :(得分:1)

创建rain.3h时,请将其分解为方法并使用TestCaseData方法。

SetName

然后当您创建private TestCaseData TestCaseData1() { TestCaseData data = new TestCaseData(); // set your variables data.SetName("TestCaseData1"); return data; }; private TestCaseData TestCaseData2() { TestCaseData data = new TestCaseData(); // set your variables data.SetName("TestCaseData2"); return data; }; ...

IEnumerable

然后,当您运行测试时,它们将单独显示,而不是与通用方法名称一起显示。

它不会让我发布图片,但它会显示如下:

  

通过测试(2)
  ()TestCaseData1
  ()TestCaseData2

答案 1 :(得分:0)

想出 a 解决方案。

将断点置于TestCaseData初始化机制(在TestCaseDatas之一中创建的某个对象)中,然后使用debug运行单个失败测试。
enter image description here

TestCaseData初始化时,它将触及断点。在断点处打开Call Stack window并转到最底线(如果它不在最后一行则遍历它们) - 您应该最终进入yield return new TestCaseData(...(见下面的屏幕截图)
enter image description here

这是失败的测试用例。

现在我不接受这个答案,万一有人有'更好'的解决方案。我的意思是这比评论测试更快,但仍需要时间。