【问题标题】:Dependency between two unit tests in c#c#中两个单元测试之间的依赖关系
【发布时间】:2014-06-19 06:12:21
【问题描述】:

假设我们有两个相互依赖的单元测试。 TestA 依赖于 TestB。现在我们要更改代码,这样当我们运行 TestA 时,TestB 会自动运行。

[TestMethod]
public void TestA()
{
    string id = "123456789";
    NewUser user = new NewUser();
    Boolean idCheck = user.checkID(id);
    Assert.IsFalse(idCheck);

}


[TestMethod]
[HostType("ASP.NET")]
[UrlToTest("http://localhost:1776/Login.aspx")]
[AspNetDevelopmentServerHost("$(SolutionDir)\\project", "/")]
public void TestB()
{
    Page page = _testContextInstance.RequestedPage;
    Button button = page.FindControl("BNewUser") as Button;
    PrivateObject po = new PrivateObject(page);
    po.Invoke("BNewUser_Click", button, EventArgs.Empty);
    Assert.IsFalse(page.Visible);

}

【问题讨论】:

  • 在 TestA() 中调用 TestB() 怎么样??
  • 单元测试不应该相互依赖
  • 我把 TestB() 放在 TestA() 里面,这个工作但还不够。我需要单元测试相互依赖,以便它们能够集成工作。

标签: c# unit-testing dependencies nunit


【解决方案1】:

单元测试应该是F.I.R.S.T。其中 I 表示孤立(不仅来自外部资源,还来自其他测试)。 TestB 应该有一个失败的原因——如果它验证的要求没有实现。在您的情况下,如果之前未运行 TestA 可能会失败,但实现了对 TestB 的要求。所以你永远无法说出测试失败的真正原因。

如果您需要在运行TestB之前设置一些前置条件,那么您应该将此前置条件设置添加到TestB的Arrange部分。

更新:Reuse of Unit Test Artifacts. Allow Us to Dream 文章只是梦想重用单元测试进行集成测试:

理论上它看起来很有趣。但在实践中,单元测试和集成测试是非常不同的。首先应该被隔离,后者则完全相反——它们应该使用真正的依赖关系和外部资源。让我们想象一下,您将使用一些依赖注入框架来为您的 SUT 提供不同的依赖实现 - 模拟用于单元测试,真实用于集成测试。听起来不错。但这会使单元测试很难维护 - 您将不知道当前测试中模拟对象的设置,因为您正在将测试的 arrange 部分从测试移到依赖注入框架。所有单元测试都将只有 actassert 部分,这将具有一定的价值,但它们将很难理解和维护。

下一部分更值得——你将如何配置依赖注入框架来为每个不同的单元测试提供不同的模拟设置?此外,集成测试将需要额外的设置和拆卸步骤,这些步骤在单独的单元测试中不存在(您应该清除和填充数据库等)。我什至无法想象运行数千个需要真实数据库、服务和文件的集成测试需要多长时间。单元测试使用模拟,因此它们很快。集成测试很慢。

如您所见,这些类型的测试在性质上非常不同。所以不要试图混合它们并按照应该使用的方式使用它们。

【讨论】:

  • 我必须找到单元测试以集成方式工作的方式,即依赖。这是我的项目。也许它是依赖注入或层次结构......
  • @Yulia 你能解释一下为什么你需要测试是依赖的吗?
  • @ Sergey Berezovskiy 我需要为集成表单运行所有单元测试,但不是集成测试,我的项目名称是“重用集成单元测试”。它可能在层次结构中运行所有单元测试,或者一个测试的输出是另一个测试的输入,也许我不需要对测试进行重构,但我需要更改我的项目代码。很难解释,我有一篇文章是解释我的项目。也许你给我写你的电子邮件,我把这篇文章发给你。
  • @Yulia 抱歉,现在得走了,一小时后回来。您可以在此处发布文章链接
  • @Sergey Berezovskiy agilerecord.com/agilerecord_16.pdf 文章:单元测试工件的重用,第 49 页。
【解决方案2】:

我认为您可能希望对单元测试使用通用初始化。您可以在继续之前验证 TestB 内部的初始化。

看看 c# unit test with common code repeated 这可能会回答你的问题。

我的观点是单元测试不应该有依赖关系,如果你发现不能分离两组功能,你可以考虑重构它。

提姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多