gpt4 book ai didi

unit-testing - 在测试类中组织单元测试

转载 作者:行者123 更新时间:2023-12-04 05:23:12 25 4
gpt4 key购买 nike

假设我在一个测试类中有几个单元测试(在我的例子中是 VSUnit 中的[TestClass])。我试图在每个测试中只测试一件事(尽管并不意味着只有一个断言)。想象一下,有一个测试(例如 Test_MethodA() )也测试其他测试中使用的方法。我不想在使用它的其他测试中对该方法进行断言以避免口是心非/可维护性问题,所以我只在这个测试中有断言。现在,当此测试失败时,所有依赖于正确执行该测试方法的测试也会失败。我希望能够更快地定位问题,所以我希望以某种方式指向 Test_MethodA。它会例如如果我可以让测试类中的某些测试以特定顺序执行并且当它们失败时我将开始寻找第一个失败测试中失败的原因,请提供帮助。你知道怎么做吗?

编辑:通过建议解决方案是按特定顺序执行测试,我可能走得太远了,而且方向错误。我不关心测试的顺序。只是如果先决条件无效,某些测试将始终失败。例如。我有一个测试 DAO 类的测试类(好吧,可能不是 UNIT 测试,但数据库存储过程中有逻辑需要测试,但我认为这不是重点)。我需要将一些记录插入表中,以测试负责检索记录的方法(我们称之为 GetAll())是否以正确的顺序获取它们,例如我通过使用 DAO 类上的方法进行插入。我们称它为 Insert()。我进行了测试,以验证 Insert() 方法是否按预期工作。现在我想测试 GetAll() 方法。为了使数据库处于所需状态,我使用 Insert() 方法。如果 Insert() 不起作用,则大多数 GetAll() 测试都会失败。我更愿意将无法通过的测试标记为因为 Insert() 无法确定而不是失败。如果我知道首先要研究哪种方法/测试,将更容易找到问题的原因。

最佳答案

您不能(也不应该)按特定顺序执行单元测试。这样做的根本原因是为了防止Interacting Tests - 我意识到您请求此类功能的动机不同,但这就是单元测试框架不允许您订购测试的原因。事实上,我上次检查时,xUnit.net甚至随机化顺序。

有人可能会争辩说,您的某些测试依赖于对同一类的不同方法调用这一事实是紧耦合的表现,但情况并非总是如此(想到状态机)。

但是,如果可能,请考虑使用 Back Door而不是其他有问题的方法。

如果您不能做到这一点或解耦相互依赖性(例如,通过使第一个方法成为虚拟方法并使用Extract and Override 技术),您将不得不忍受它。

这是一个例子:

public class MyClass
{
public virtual void FirstMethod() { // do something... }

public void SecondMethod() {}
}

由于 FirstMethod 是虚拟的,您可以从 MyClass 派生并覆盖其行为。您还可以使用动态模拟来为您做到这一点。使用最小起订量,它看起来像这样:

var sutStub = new Mock<MyClass>();
// by default, Moq overrides all virtual methods without calling base

// Now invoke both methods in sequence:
sutStub.Object.FirstMethod(); // overriden by Moq, so it does nothing
sutSutb.Object.SecondMethod();

关于unit-testing - 在测试类中组织单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com