集成测试垃圾数据
Integration testing garbage data
我已经使用 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 中拦截测试取消的方法。
我看到有两个选项可以解决您的问题:
- 每次开始前清理模拟数据。仅在开始之前。
- 每个测试都包装为一个永远不会提交的数据库事务。我解释
这个选项 here
我已经使用 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 中拦截测试取消的方法。
我看到有两个选项可以解决您的问题:
- 每次开始前清理模拟数据。仅在开始之前。
- 每个测试都包装为一个永远不会提交的数据库事务。我解释 这个选项 here