【问题标题】:c# unit test with common code repeated [duplicate]c#单元测试,公共代码重复[重复]
【发布时间】:2012-12-06 06:08:26
【问题描述】:

可能重复:
What would be an alternate to [SetUp] and [TearDown] in MSTest?

我正在学习如何总体上使用单元测试和自动化测试,并且有一些我无法弄清楚/找不到答案的问题

我目前通过多个调用各种方法并在其中包含断言的 [TestMethod] 进行测试。现在,TestMethod 都有重复的代码来访问数据库并为其余的测试设置自己。一个例子是:

public void TestDBReturnsFooInFormatXyz() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo format is xyz );
}

public void TestDBFooContainsAbc() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo contains abc );
}

所以有几个问题: 在测试类中创建私有字段并让构造函数设置它们是最佳实践吗?

我是否应该在每个 TestMethod 中都这样做,因为测试速度并不重要?

我应该在构造函数顶部放置什么 [Test???] 以确保在运行测试时调用它?

我查看了 MSDN 和“Programming Microsoft Visual C# 2008: The Language”一书,但找不到任何关于单元测试的好信息。如果有我应该阅读的资源可以回答这些问题,请告诉我。

谢谢!

【问题讨论】:

  • 那个副本完全是一个副本,但是 [TestInitialize] 方法可能是你想要的。
  • 谢谢,我没有意识到 [TestInitialize] 和 [CleanUp] 存在
  • 不应将测试排除在重构阶段。
  • 嗨,西蒙,如果您有时间,您可以详细介绍一下吗?我找到的最佳参考是:stackoverflow.com/questions/5657433/…,但我不清楚该答案的含义。我应该重构测试,所以在学习如何进行单元测试时不用担心重复的代码?

标签: c# unit-testing mstest


【解决方案1】:

重复代码总是一种不好的做法,所以你应该重构你的代码来初始化TestInitialize Method中的foo对象,它在每次测试运行之前执行一次,然后在每个测试运行中执行特定的操作测试用例:

private FooType foo;

[TestInitialize()]
public void TestInitialize()
{
    foo = CreateFooObject();
}

[TestMethod()]
public void TestToAssertThatAbcStuffGetsDone()
{
    foo.DoAbcStuff();
    Assert.IsTrue(foo.DidAbc());
}

[TestMethod()]
public void TestToAssertThatXyzStuffGetsDone()
{
    foo.DoXyzStuff();
    Assert.IsTrue(foo.DidXyz());
}

如果您的 foo 对象需要在每次测试方法运行后释放,您还应该实现 TestCleanup Method

但是,using a database in your unit tests is not considered a best practice 因为您不希望外部依赖项影响您的测试结果。相反,您应该使用类似于数据库但将单元测试与真实数据库依赖项隔离开来的数据库模拟。

一些与数据库相关的问题可能会破坏您的测试,例如连接失败、超时、数据更改和偶尔的数据库升级。 This SO question 讨论处理数据库依赖问题的策略。

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2012-05-16
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多