如何为遗留代码编写测试然后重构它?
How to write tests for legacy code and then refactor it?
我有一个项目,其中有很多我以前写过的难看的代码。现在我正在尝试使其可测试并使用 TDD 进行进一步开发。但每次我尝试为现有代码编写单元测试时,我都会遇到困难。我只是不知道如何测试我的旧代码。我不能写任何小测试。这让我感到恶心。那么谁能告诉我为这样的函数编写什么测试以使进一步的重构变得轻松:
public void ChangeHealth(UInt16 id, HealthTypes health, FighterCount count)
{
var uc = new FighterCommand {Health = health, KillerId = 1024};
Fighter f;
switch(count)
{
case FighterCount.All:
if (Fight.GetInstance().Status == FightStatuses.Enable)
{
foreach (var u in Fighters.Elements)
uc.AddUnit(u.Id);
}
FightEvents.StatusUnit(null, health);
_sender.SendCommand_AppServer(uc);
break;
case FighterCount.NotEqual:
for (var i = Fighters.Count - 1; i >= 0; i--)
{
f = Fighters.GetUnit(i);
if (health == f.Health) continue;
uc.AddUnit(f.Id);
FightEvents.StatusUnit(f, health);
}
if (uc.UnitCount > 0) _sender.SendCommand_AppServer(uc);
break;
default:
f = Fighters.GetById(id);
uc.AddUnit(f.Id);
FightEvents.StatusUnit(f, health);
_sender.SendCommand_AppServer(uc);
break;
}
}
看看 Michael Feathers 的 "golden master" 技术。这个想法是,您向无法测试的代码输入数据,记录输出或程序状态。然后您可以重构并抛出相同的输入并观察相同的输出或内部状态(除了您所做的微小增量更改之外)。一点一点地,代码变得更可测试。在 http://blog.thecodewhisperer.com/2014/09/28/surviving-legacy-code-with-golden-master-and-sampling/
处进行了更深入的解释
用于转储应用程序状态的工具是 https://github.com/kbilsted/StatePrinter,您可以在其中简单地说
var printer = new Stateprinter();
Console.WriteLine( printer.PrintObject( myProgram) );
我有一个项目,其中有很多我以前写过的难看的代码。现在我正在尝试使其可测试并使用 TDD 进行进一步开发。但每次我尝试为现有代码编写单元测试时,我都会遇到困难。我只是不知道如何测试我的旧代码。我不能写任何小测试。这让我感到恶心。那么谁能告诉我为这样的函数编写什么测试以使进一步的重构变得轻松:
public void ChangeHealth(UInt16 id, HealthTypes health, FighterCount count)
{
var uc = new FighterCommand {Health = health, KillerId = 1024};
Fighter f;
switch(count)
{
case FighterCount.All:
if (Fight.GetInstance().Status == FightStatuses.Enable)
{
foreach (var u in Fighters.Elements)
uc.AddUnit(u.Id);
}
FightEvents.StatusUnit(null, health);
_sender.SendCommand_AppServer(uc);
break;
case FighterCount.NotEqual:
for (var i = Fighters.Count - 1; i >= 0; i--)
{
f = Fighters.GetUnit(i);
if (health == f.Health) continue;
uc.AddUnit(f.Id);
FightEvents.StatusUnit(f, health);
}
if (uc.UnitCount > 0) _sender.SendCommand_AppServer(uc);
break;
default:
f = Fighters.GetById(id);
uc.AddUnit(f.Id);
FightEvents.StatusUnit(f, health);
_sender.SendCommand_AppServer(uc);
break;
}
}
看看 Michael Feathers 的 "golden master" 技术。这个想法是,您向无法测试的代码输入数据,记录输出或程序状态。然后您可以重构并抛出相同的输入并观察相同的输出或内部状态(除了您所做的微小增量更改之外)。一点一点地,代码变得更可测试。在 http://blog.thecodewhisperer.com/2014/09/28/surviving-legacy-code-with-golden-master-and-sampling/
处进行了更深入的解释用于转储应用程序状态的工具是 https://github.com/kbilsted/StatePrinter,您可以在其中简单地说
var printer = new Stateprinter();
Console.WriteLine( printer.PrintObject( myProgram) );