我有一个测试脚本,它对一个对象执行某些操作,然后对第二个对象执行相同的操作。这持续了很长时间。有了这么多的可预测的重复,自动化似乎已经成熟,但我不知道如何。我不会在乎这么多,除非有这么多的重复,使用错误的变量很容易忽略(例如:prodXyz意图时的stagingXyz)。在2个对象上运行相同的代码
下面的细节是不相关的。重要的是这种模式。
var stagingDbs = cleanupDbs(stagingServer.Databases);
var prodDbs = cleanupDbs(prodServer.Databases);
printDiff(stagingDbs, prodDbs, "Databases mis-matched");
foreach (var db in stagingDbs.Intersect(prodDbs)) {
var stagingDb = stagingServer.Databases[db];
var prodDb = prodServer.Databases[db];
var stagingTables = cleanupTables(stagingDb.Tables);
var prodTables = cleanupTables(prodDb.Tables);
printDiff(stagingTables, prodTables, "Tables mis-matched on " + db);
foreach (var table in stagingTables.Intersect(prodTables)) {
var stagingTable = stagingDb.Tables[table];
var prodTable = prodDb.Tables[table];
var matchedColumns = stagingColumns.Intersect(prodColumns);
var stagingTableColumns = stagingTable.Columns
.Cast<Column>()
.Where(c => matchedColumns.Contains(c.Name))
.Select(c => formatColumn(c));
var prodTableColumns = prodTable.Columns
.Cast<Column>()
.Where(c => matchedColumns.Contains(c.Name))
.Select(c => formatColumn(c));
printDiff(stagingTableColumns, prodTableColumns,
"Columns mis-matched");
}
}
我不想去通过,例如,用这种
var stagingTableColumns = doStuff(stagingTable, matchedColumns);
var prodTableColumns = doStuff(prodTable, matchedColumns);
更换此
var stagingTableColumns = stagingTable.Columns
.Cast<Column>()
.Where(c => matchedColumns.Contains(c.Name))
.Select(c => formatColumn(c));
var prodTableColumns = prodTable.Columns
.Cast<Column>()
.Where(c => matchedColumns.Contains(c.Name))
.Select(c => formatColumn(c));
因为我必须确保一切都在第一线stagingXyz
,第二行是prodXyz
。对于1行来说并不是那么糟糕,但是测试脚本非常庞大,并且只有这两件事中的一个:
- foo(stagingXyz); FOO(prodXyz);
- bar(stagingXyz,prodXyz);
类似地,在一个阵列这些物品包装和具有doStuff[0]; doStuff[1];
是经受相同的易错字错误只以0对1笔误将更加努力一目了然发现。
我想过要制作2个容器对象(一个用于分级,一个用于产品),并将这两个对象放在一个集合中,但是我担心这会导致一个很难维护的极小的循环。
无论如何要简化这一点,仍然有它可读性和可维护性?
我认为它没有以这种方式构建的原因已经是因为他需要在这对对象上执行增量操作,而不是对所有对象执行所有操作。 – twon33 2010-10-14 19:30:47
它听起来像你的建议将运行obj1然后一切obj2。这不会与原始示例中的效果相同;最显着的是在循环内部。 – Dinah 2010-10-14 19:33:39
编辑为了更好地反映问题。 – Ocelot20 2010-10-14 19:47:28