gpt4 book ai didi

c# - C# 中两个单元测试之间的依赖关系

转载 作者:行者123 更新时间:2023-12-03 09:24:35 25 4
gpt4 key购买 nike

假设我们有两个相互依赖的单元测试。 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);

}

最佳答案

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

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

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

enter image description here

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

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

正如您所看到的,这些类型的测试本质上非常不同。因此,不要尝试混合使用它们,而是按其应有的用途使用它们。

关于c# - C# 中两个单元测试之间的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430183/

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