在构建健壮的文件导入器时,您的第一个TDD测试是什么?



我最近读了很多关于TDD的文章,但我只看到了一些小的例子。

现在我必须从一个(不是很大,但不仅仅是一个类)文件导入器开始,它必须是健壮的,所以它必须检查文件是否存在(在FTP服务器上),如果它不是重新安排自己,当文件损坏时不要崩溃,是可重新运行的等等:一个可以启动的导入器,不必每天检查日志文件。

那么当开始构建这样一个程序时,我从哪里开始使用TDD呢?

它是在最低级别,如实现GetFile()或Reschedule(),然后工作我的方式,还是我先创建"控制器",让那一个先失败,因为我没有设置任何测试文件和钻在所有的功能?

由于文件导入器的主要焦点是导入文件(是吗?),这应该是您的第一站。编写一个测试以确保您能够检索一个文件。

就我个人而言,我会在开始编码之前勾勒出您想要使用UML实现的内容。它将帮助你确定你需要写什么。

从头说起。第一个可测试的功能是"它必须检查文件是否存在于FTP服务器上"。我可以想到至少两个测试用例:文件存在文件不存在。这是两个测试。如果服务器不存在怎么办?然后会发生什么?好吧,也测试一下。当你用英语描述你的单元应该做什么时,就像你在问题中所做的那样,把描述翻译成测试。

没有一点功能是你不想使用的,不是吗?然后全部测试。您编写测试的顺序并不(太)重要——最终您会希望测试每一个比特(如果您真的遵循TDD,那么在编写比特之前,每个比特都将经过测试)。

我想我会从我想要完成的事情开始。因此,例如,如果我正在编写某种个人理财软件,我会以这样的内容开始:

<>之前@Testpublic void importsTransactionsFromQuicken() {列表事务= new QuickenImporter().importFrom("filename.qfx");assertSomeStuffAbout(事务);}之前

现在,一旦您使其工作,您可以重构和模拟文件处理以避免一些I/O。这可能会导致读取文件的抽象。

接下来,开始寻找其他场景。例如,您以损坏的文件为例。那么,如果文件损坏了该怎么办呢?

<>之前@TestlogsAndRemovesCorruptFiles() {文件cf = new CorruptFile();loglog ls = new LogSpy();//注意,这可能是模拟I/O后重构的接口quickenimport_qi = new quickenimport_qi (cf, ls);列表事务= qi.import();assertEmptyList(事务);assertFileWasDeleted (cf);assertCorruptLogEntryWasWritten (ls);}之前

你可以看到我做了一些重构,包括一些构造函数注入,等等,但是测试真的推动了下一步。至于"Reschedule"函数,它似乎违反了单一职责原则,所以它可能属于另一个类,例如ImportScheduler类。如果是这种情况,我知道我想要的导入器行为是什么,当它找不到文件,所以我将做另一个测试:

<>之前@Test公共void doesntReturnAnyTransactionsWhenFileNotPresent() {QuickenImporter qi = new QuickenImporter(new NonExistentFile(), NULL_LOGGER);列表事务= qi.import();assertEmptyList(事务);}之前

现在,为了测试调度组件,我可以编写一个ImportSchedulerTest,其中包含两种情况的测试用例(当我有文件和当我没有文件时)。

希望有帮助!

最新更新