【问题标题】:Integration testing garbage data集成测试垃圾数据
【发布时间】:2018-05-27 11:49:29
【问题描述】:

我已经使用 MSTest 设置了集成测试。我的集成测试会创建假数据并将它们插入数据库(真正的依赖项)。对于每个业务对象,我都有一个这样的方法,它创建一个“Fake”并将其插入到数据库中:

public static EventAction Mock()
{
    EventAction action = Fixture.Build<EventAction>().Create();
    action.Add(false);
    AddCleanupAction(action.Delete);
    AppendLog("EventAction was created.");
    return action;
}

我清理了 [AssemblyCleanup] 中的所有假货:

public static void CleanupAllMockData()
{
    foreach (Action action in CleanUpActions)
    {
        try
        {
            action();
        }
        catch
        {
            AppendLog($"Failed to clean up {action.GetType()}. It is possible that it was already cleaned up by parent objects.");
        }
    }
}

现在,我有一个大问题。在我的持续集成环境(TeamCity)中,我们有一个单独的数据库用于测试,每次测试运行后它都会自行清理,但在我的本地环境中,集成测试指向我的本地数据库。现在,如果我出于任何原因取消测试运行,则会在我的本地数据库中留下一堆垃圾数据,因为 CleanupAllMockData() 永远不会被调用。

处理此问题的最佳方法是什么?我找不到在 MSTest 中拦截测试取消的方法。

【问题讨论】:

  • 你可以在每次测试后运行 CleanupAllMockData() 吗?
  • @Kris,最初,我在 [TestCleanup] 中运行它,但注意到对性能有负面影响。测试运行需要 20 分钟 vs ~ 6 分钟,但同样,如果我取消测试,假货将不会被清理。

标签: c# integration-testing mstest dummy-data


【解决方案1】:

我看到了两种解决您问题的方法:

  1. 在每次启动前清理模拟数据。只是在开始之前。
  2. 每个测试都包装为一个永远不会提交的数据库事务。我解释 这个选项here

【讨论】:

  • 第二种方法是否适用于以下场景?我想将一堆记录添加到数据库中,然后我想选择这些记录进行断言。
  • @ShervinShahrdar,是的。是的,它可以在一种测试方法中工作。事务的回滚将在方法终止后发生,即断言块。如果您需要在测试方法之间保存添加的行,那么您需要在SetUpTearDown 方法中实现类似的东西
  • 我尝试了你的两个建议。第二个由于某种原因出现了一些性能问题,我的一些测试失败了,因为它们需要提交数据。我最终选择了第一个选项。但是,在删除实际的假对象之前,我必须先优化我的假数据清理代码以删除所有依赖项。性能现在可以接受。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2014-01-31
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
相关资源
最近更新 更多