实施多阶段流程时的 TDD 策略?
TDD strategy when implementing a multi-stage process?
目前我正在开发一段代码,它首先从一组文档中收集句子,然后对这些进行标记,然后使用结果分析标记序列的重复出现频率,包括大小写变化(上 case/lower case/leading cap/other), 然后打印出结果。
现在我想在打印结果之前再介绍两个阶段:
1. 首先,删除 "stop words"(即频率永远不会被关注的单词或短序列,例如,在英语中,"the"、"of the"、"of which"、等)-这些停用词/"stop sequences" 从数据库中获取 table
2. 其次,打开一个对话框,使用户能够识别新停用词的序列,然后删除涉及的标记序列,并将有问题的序列添加到数据库中 table.
问题是,这是一个多阶段的过程,我只是想知道 TDD 专家面对这样的情况会怎么做:我是否为每个单独的阶段创建一个新的测试方法...?问题是每个单独的阶段都需要使用前一阶段的 "live memory data" :另一种可能性可能是以某种方式序列化这些数据,然后在测试下一阶段时反序列化它......但这将涉及应用程序代码执行仅对测试代码有益的事情,即这意味着调整("distorting"?)应用程序代码以使测试代码受益,这在原则上似乎是错误的...
另外,如果有人能给我指出可以帮助像我这样的 TDD 新手的书籍或网站的方向 "the next level",我将非常感激。
以后
致将此标记为 "favorite" 的人:我现在拿到了一本名为 "Growing Object-Oriented Software, Guided by Tests" 的书,这本书经过了很好的评论,似乎适合那些想从初学者开始的人到中间。第一印象不错。
当然也欢迎专家对本书的看法...
从表面上看,您似乎在构建管道。据我所知,您目前正在单个 class 中实现所有这些,它存储正在处理的数据并实现执行处理的方法。您可以采用的一种方法是将问题分解为更小的块。管道的每个阶段都有一个 class,而管道的每个阶段都有一个 class,而另一个 class 用于编排流程,该流程负责以正确的顺序将各个阶段连接在一起。
因此,浏览您所描述的内容后,您似乎拥有以下处理器:
- DocumentReader(从某处读取文档到内存文档)
- SentenceExtractor(document/list 文档,输出句子列表)
- 1 个或多个 SentenceAnalysers(输入句子,输出统计数据),您可能希望根据分析类型及其复杂程度对其进行分解。
- StopWordExtractor(StopWordProvider 和句子输入,句子输出)
需要额外的支持 classes,以支持将新停用词写入数据库,并根据停用词提供程序的实现方式在用户选择新停用词时保持同步。
基本上,我的意思是您似乎在一个地方做的太多了。如果您真的 对您描述的代码是一个单元感到高兴,那么您在一个地方测试它就没有错,但是您的输入将是您的起始 documents/sentences 和您的输出将是该过程的结束。如果您真的同意我的看法,流程中涉及几个可以独立更改的不同组件,那么我建议将流程分解为更小的 classes 并测试这些组件是否按给定的 inputs/outputs...
目前我正在开发一段代码,它首先从一组文档中收集句子,然后对这些进行标记,然后使用结果分析标记序列的重复出现频率,包括大小写变化(上 case/lower case/leading cap/other), 然后打印出结果。
现在我想在打印结果之前再介绍两个阶段:
1. 首先,删除 "stop words"(即频率永远不会被关注的单词或短序列,例如,在英语中,"the"、"of the"、"of which"、等)-这些停用词/"stop sequences" 从数据库中获取 table
2. 其次,打开一个对话框,使用户能够识别新停用词的序列,然后删除涉及的标记序列,并将有问题的序列添加到数据库中 table.
问题是,这是一个多阶段的过程,我只是想知道 TDD 专家面对这样的情况会怎么做:我是否为每个单独的阶段创建一个新的测试方法...?问题是每个单独的阶段都需要使用前一阶段的 "live memory data" :另一种可能性可能是以某种方式序列化这些数据,然后在测试下一阶段时反序列化它......但这将涉及应用程序代码执行仅对测试代码有益的事情,即这意味着调整("distorting"?)应用程序代码以使测试代码受益,这在原则上似乎是错误的...
另外,如果有人能给我指出可以帮助像我这样的 TDD 新手的书籍或网站的方向 "the next level",我将非常感激。
以后
致将此标记为 "favorite" 的人:我现在拿到了一本名为 "Growing Object-Oriented Software, Guided by Tests" 的书,这本书经过了很好的评论,似乎适合那些想从初学者开始的人到中间。第一印象不错。
当然也欢迎专家对本书的看法...
从表面上看,您似乎在构建管道。据我所知,您目前正在单个 class 中实现所有这些,它存储正在处理的数据并实现执行处理的方法。您可以采用的一种方法是将问题分解为更小的块。管道的每个阶段都有一个 class,而管道的每个阶段都有一个 class,而另一个 class 用于编排流程,该流程负责以正确的顺序将各个阶段连接在一起。
因此,浏览您所描述的内容后,您似乎拥有以下处理器:
- DocumentReader(从某处读取文档到内存文档)
- SentenceExtractor(document/list 文档,输出句子列表)
- 1 个或多个 SentenceAnalysers(输入句子,输出统计数据),您可能希望根据分析类型及其复杂程度对其进行分解。
- StopWordExtractor(StopWordProvider 和句子输入,句子输出)
需要额外的支持 classes,以支持将新停用词写入数据库,并根据停用词提供程序的实现方式在用户选择新停用词时保持同步。
基本上,我的意思是您似乎在一个地方做的太多了。如果您真的 对您描述的代码是一个单元感到高兴,那么您在一个地方测试它就没有错,但是您的输入将是您的起始 documents/sentences 和您的输出将是该过程的结束。如果您真的同意我的看法,流程中涉及几个可以独立更改的不同组件,那么我建议将流程分解为更小的 classes 并测试这些组件是否按给定的 inputs/outputs...