C# 测试用例是否应该链接?

C# 测试用例是否应该链接?,c#,unit-testing,chaining,C#,Unit Testing,Chaining,假设我有以下要测试的通用工作流: CreateObject-->AddItemsObject-->SaveObject-->ChangeObjectToFirstState-->ChangeObjectToSecondDependentOnBeginFirstState-->等 我应该: A) 为所有这些状态编写一个测试用例-即CreateObject将测试对象是否正确创建,AddItemsObject将使用所用代码CreateObject的副本,然后测试向对象添加项目是否正确处理,SaveOb

假设我有以下要测试的通用工作流:

CreateObject-->AddItemsObject-->SaveObject-->ChangeObjectToFirstState-->ChangeObjectToSecondDependentOnBeginFirstState-->等

我应该:

A) 为所有这些状态编写一个测试用例-即CreateObject将测试对象是否正确创建,AddItemsObject将使用所用代码CreateObject的副本,然后测试向对象添加项目是否正确处理,SaveObject将使用所用代码AddItemsObject的副本,然后将对象保存到数据库并测试是否正确保存,等等

B) 为CreateObject编写测试用例,并获得成功的结果,返回一个创建的对象,然后AddItemsObject将其用作要添加项的对象,SaveObject将其用作要保存的对象,等等

C) 不必麻烦将链的每个步骤拆分为单独的测试用例,只需为每个完整的链编写一个测试用例

我已经尝试搜索其他可能回答此问题的示例,但没有任何结果-如果已经完全回答了,请将相应的问题与我链接:)

*编辑*

把这句话重新解释一下,让它更像一个问题:

是否有任何特定的理由不使用基于链的方法为工作流编写测试用例


换句话说,对于多阶段工作流,在实现将对象从状态#3推进到状态#4的测试用例时,是否有任何特定原因不首先调用将对象从状态#2推进到状态#3的测试用例

TL;DR-结合不同级别的测试,单元(案例A)->集成(案例B)是理想的方法

我经常看到,向代码库添加测试与其说是一个单一的工作项,不如说是一个旅程。需要考虑许多变量,例如分配给测试的时间、系统的关键性、代码的复杂性等

就您的示例而言,从开发人员的角度来看,编写广泛的集成测试(案例C)几乎总是更简单、更快。然而,正如所指出的,这种方法也有缺点。举几个例子,1)如果失败,调试将更加困难;2)如果n个函数中的每一个都有(例如)2个代码路径,则需要2^n个测试用例来覆盖所有路径。这就是说,集成/系统测试总是比没有测试好。根据我的经验,在测试现有/遗留代码库时,它们是最有价值的代码

另一方面,如果您有时间,为特定函数编写单元测试(案例A)是补充测试基础的一个很好的方法。在这种情况下,使用上面列出的变量,您只需要2*n个测试就可以覆盖所有路径,并且一个测试中的失败将标识一个较小的向量以进行调试。这里的一个好模式是使用像Moq这样的DI框架来隔离每个单独组件的逻辑


案例B也不一定是一个糟糕的方法;它本质上是一种集成测试形式,您可以从中更深入地了解问题发生的地方。同样,这些是您需要在项目上下文中做出的决策,考虑到整个工作流上下文中每个单独功能的复杂性

你是在描述一个调用堆栈还是一个工作流?这是一个基于观点的问题,考虑到我会为每个完整的链选择一个测试用例,也可能是一个测试用例。B的问题是,如果出现问题,测试失败,你必须遍历整个链条来了解原因。@bradbury9,不完全确定你的意思-我试图为状态机编写测试用例,基本上可以通过流程图来描述。我不是说为特定的状态编写测试用例。相反,我要问的是,例如,测试第四个状态是否应该首先调用将其带到第三个状态的测试用例(这反过来也会对第二个状态执行相同的操作,等等),或者测试第四个状态是否应该包含将其带到第四个状态的代码。嘿@chill94,感谢您的见解。在案例A和案例B之间,你推荐哪一种?就个人而言,我觉得案例B是更好的选择,但实际上我还没有找到任何文章或线索真正推荐它,这就是我为什么要问的原因-通常如果没有人问问题,这意味着a)答案如此明显,以至于没有人愿意问,或者B)我没有正确搜索:)@KiranRamaswamy-Edit:我误读了这个问题-下面比较了A和C。让我添加一个新的注释来回答你的实际问题。---我刚才补充了一个要点。理想情况下,两者都要。查看链接文章,了解更多关于这方面的信息。他们每个人都有优点和缺点,他们每个人都需要时间来写作。如果时间是一个主要因素,我会选择案例C,因为这将决定功能是否有效(本质上)。使用我上面评论中的许多观点,如果时间是一个主要因素,案例B将是一条出路,因为它在许多方面与案例C相似。您不需要提取依赖项来进行可靠的单元测试。也就是说,如果您有时间,编写可靠的、可测试的代码(以及相应的单元测试——案例A)总是一项巨大的投资。但是,我不能提出建议,因为这在实践中是一个复杂的决定。你现在能做的最好的事情就是继续阅读和学习测试(你正在做什么!)继续做出明智的决策我通读了你链接的stackoverflow线程,它确实给了我一些见解,但它并没有真正回答我的具体问题。在我的示例中,案例A和案例B都是集成测试——它们不是单元测试,因为,例如,状态4的测试用例不是以对象开始的