Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试单元';TDD中的s效率_Python_Unit Testing_Testing_Tdd - Fatal编程技术网

Python 测试单元';TDD中的s效率

Python 测试单元';TDD中的s效率,python,unit-testing,testing,tdd,Python,Unit Testing,Testing,Tdd,假设我们需要一个排序函数,并希望确保它是在O(nlogn)中实现的,而不是在O(n^2)中实现的 使用测试驱动开发,是否有系统的方法来测试此功能的实现效率 根据,测试实现细节被认为是测试驱动开发中的反模式,这是否阻止了TDD检查满足需求的代码的效率?还是有一种系统化的方法可以做到这一点?这并不是TDD的最佳点——请记住,TDD的动机不是测试(尽管这是一个很好的副作用),而是设计,也就是说,使代码易于更改 TDD仪式的一部分是在开发周期中频繁运行测试;偏离开发流程的测试(例如,运行时间过长)是不允

假设我们需要一个排序函数,并希望确保它是在
O(nlogn)
中实现的,而不是在
O(n^2)
中实现的

使用测试驱动开发,是否有系统的方法来测试此功能的实现效率


根据,测试实现细节被认为是测试驱动开发中的反模式,这是否阻止了TDD检查满足需求的代码的效率?还是有一种系统化的方法可以做到这一点?

这并不是TDD的最佳点——请记住,TDD的动机不是测试(尽管这是一个很好的副作用),而是设计,也就是说,使代码易于更改

TDD仪式的一部分是在开发周期中频繁运行测试;偏离开发流程的测试(例如,运行时间过长)是不允许的。这并不是说你不能进行这些测试;支持TDD的一个理由是,它确保您拥有可测试的代码。但是在红/绿/回收仪式期间,您通常不会期望运行需要大量挂钟时间的测试

此外,当实现不稳定时,与实现紧密耦合的测试是真正的阻力。当测试干扰代码中封装设计的更改时,您将失去可信度

有时,您可以引入可观察性需求,以便从系统外部获得调用关键部分的频率计数。只要系统正在使用该关键部分,那么您就可以使用计数作为证据,并估计实现是否按照您期望的方式扩展

在sort的情况下,这可能意味着比较函数是一个可配置依赖项的设计,在测试中,我们提供了一个计算调用频率的实现


但这确实引入了一些耦合——在这一点上,您要衡量的是您的方法是否被调用,而不是测试主体是否给出了正确的答案。在某些情况下,这很好。在其他情况下,这是过度耦合。我不知道有哪种简单的启发式方法可以用来区分这两种情况,而不必尝试实验,也不会在过度耦合发生时被烧坏。

您可以使用test after代替TDD:

  • 注入一个测量操作数的计数器
  • 对给定的输入运行算法
  • 确认计数小于阈值
这将防止业务数量的倒退。(请记住,这并不能保证真实世界的性能。)