不用测试框架我们也可以编写一个自动化的单元测试。实际上,因为开发人员更习惯于将测试自动化,他们中很多人在知道有测试框架之前,就已经在做自动化的单元测试了。在本节中,我会展示没有框架是怎么编写自动化单元测试的,你可以把这个例子和第2章中使用框架的例子进行对比。 假设有一个类SimpleParser(如代码清单1-1所示)需要测试。这个类有一个方法ParseAndSum。ParseAndSum的输入是由零个或多个逗号分隔的数值组成的字符串。如果输入字符串不包含数值,方法返回0。如果输入包含单个数值,方法返回这个数值的int值。如果输入包含多个数值,方法把所有数值相加,返回总数(但是现在这段代码只能处理零个或一个数值)。是的,我知道代码里的else语句不是必需的,但是我们也不用这么死板吧。我倒觉得这个else语句增加了代码的可读性。 代码清单1-1 要测试的简单解析类 你可以创建一个简单的控制台应用项目,引用包含这个类的程序集,然后写一个如下面代码清单所示的方法SimpleParserTests。这个测试方法调用这个产品类(即被测试的类),然后检验调用的返回值。如果返回值和预期值不同,测试方法就会把结果输出到控制台。这个测试方法也会捕捉任何异常,并且把异常信息输出到控制台。 代码清单1-2 测试SimpleParser类的一段简单代码 接下来,你可以在这个项目的控制台程序里,使用方法Main调用你写的测试,具体请参见下面的代码清单。方法Main在这里用作一个简单的测试运行器,逐个调用测试,让测试结果输出到控制台。因为这是一个可执行程序,它可以无需人工干预自己运行(假设这些测试不会弹出任何交互式的用户对话框)。 代码清单1-3 通过一个简单的控制台程序运行测试代码 捕获发生的任何异常并输出到控制台是测试方法的职责,这样异常就不会干扰其后方法的运行。之后随着在项目中加入更多的测试,你可以在方法Main中增加更多的方法调用。每个测试各自负责把问题输出(如果有问题的话)到控制台屏幕。 显然,这是一种随意的测试编写方法。如果要编写多个这样的测试,你可能希望有一个通用的ShowProblem方法,所有的测试都可以用这个方法一致地格式化错误信息。你也可以添加专门的辅助方法,辅助检查空对象、空字符串等情况,避免在多个测试中重复书写同样的冗长代码。 下面的代码清单展示了使用一个较为通用的ShowProblem方法的测试代码。 代码清单1-4 使用一个较为通用的ShowProblem方法 单元测试框架可以像上面的示例一样创建更为通用的辅助方法,使测试更容易编写。我会在第2章讨论测试框架的这个功能。在那之前,我们来看“如何编写单元测试”之外的一个重要问题,那就是“在开发过程中应该何时编写单元测试”。这就是测试驱动开发要解决的问题。