当对目标进行单元测试时,它的目的是跟踪不同的经过时间长度,有没有办法加快这个过程?

问题描述 投票:0回答:1

Longform问题:

当对目标进行单元测试时,它的目的是跟踪不同的经过时间长度,有没有办法加快过程而不必坐下来?实质上,如果有一个单元测试需要60秒或更长时间才能完成,有没有办法在一两秒内模拟该测试。我不想要一些会欺骗测试的东西,因为我仍然需要相同的,可靠的结果,只是在我得到它们之前没有等待的时间。我想你可以说我在问是否有人知道如何实现一种时间扭曲。

背景资料:

我目前正在处理一个可以向上或向下计数的对象,然后在所需的时间过去后执行操作。我的所有测试都通过了,所以我在那方面完全没问题。我的问题是测试需要不同的时间才能完成测试。对于短测试来说这不是问题,比如五秒,但是如果我想测试更长的时间,比如六十秒或更长,我必须等待那么久才能得到我的结果。

我在一些测试中使用更长的时间来查看时间的精确程度,如果我确定逻辑是正确的,那么翻转不是问题。我基本上发现,虽然大多数测试的持续时间很短,但有一些必须更长。

我一直在谷歌搜索,无论我用过什么搜索词,我似乎无法找到这样的问题的答案。似乎唯一突然出现的是“通过单元测试加快速度”和其他具有这种性质的人。我目前正在使用VS2017附带的MSTestv2框架,如果这有帮助的话。

任何帮助是极大的赞赏!

编辑:

谢谢你的回复!我很欣赏到目前为止我已经获得的信息,很高兴能够对我如何解决这个问题有一个全新的认识。如果其他人有任何他们想要/想要添加的东西,我会全都耳朵!

c# .net unit-testing tdd
1个回答
1
投票

1998年,John Carmack wrote

如果你不把时间视为输入值,那么在你做之前要考虑它 - 这是一个重要的概念

这里的基本思想是你的逻辑需要花时间作为输入,你的边界将有一个可以与时钟集成的元素。

在C#中,结果可能看起来像端口和适配器;你有一个描述你想要如何与时钟交互的端口(接口),以及一个实现接口的读卡器(实现),它读取你将在生产中使用的时钟。

在单元测试中,使用您控制的实现替换生产适配器。

主要观点:

构建软件设计有两种方法:一种方法是使其变得如此简单,以至于显然没有缺陷

您的适配器实现应该如此简单(按设计),您只需查看它并评估其正确性。没有逻辑,没有数据转换,只是最简单的事情,可能会使你与边界隔离。

请注意,这可能与您当前的设计有很大不同。这没关系,也是测试驱动设计的一部分;测试中的困难应该可以帮助您识别代码中可分离的职责,并围绕它们创建正确的边界。

Cory Benfield关于building protocol libraries the right way的讨论在从套接字读取数据的上下文中描述了这种方法;从IO读取数据,只需将字节原样复制到执行所有逻辑的状态机中。

因此,您的“时钟”实际上可能只是时间戳事件的流/序列,然后您的单元测试文档“给定此时间戳序列,然后这是功能核心的预期行为”。

实际与真实时钟交互的较慢测试从单元测试套件移至集成套件。它们仍然具有价值,您仍然希望它们通过,但您不希望它们产生的延迟中断开发/重构工作流程。

© www.soinside.com 2019 - 2024. All rights reserved.