为了账号安全,请及时绑定邮箱和手机立即绑定

将生产代码修改为可测试/仅用于测试目的是否是最佳做法?

将生产代码修改为可测试/仅用于测试目的是否是最佳做法?

MM们 2022-09-28 16:28:28
目前在生产代码中,我有这样的功能public void doWork() {    ... call functionA    ... call functionB    ... do other work}我必须测试一个在 doWork() 中调用函数 A 后需要暂停的情况。而且我没有办法暂停测试框架所以我把生产改成了public void doWork() {    doWork(new CountdownLatch(0))}public void doWork(CountdownLatch latch) {    ... call functionA with a latch and functionA calls latch.await()    ... call functionB    ... do other work}现在,我可以创建一个测试用例并测试doWork(new CountdownLatch(1))但在生产中,它总是在调用,而调用又在调用doWork()doWork(new CountdownLatch(0))这种不必要的开销只是为了能够使代码可测试吗?或者这是可以接受的吗?
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

修改代码以使其可测试是完全有效的。测试只是代码的另一个客户端,因此提供有关代码可用性的反馈。

另一方面,为了使反馈具有建设性,测试必须遵守一些规则。例如,它应该测试代码的行为,而不是其内部结构。

现在,对于实际测试,您有更多的选择。

  • 大多数海峡前进将是使用测试替身作为其依赖关系。您提到函数A是最终的,因此不能被嘲笑。它可以。虽然不是理想的解决方案,但模拟2.+强力莫克都支持嘲笑。final classes

  • 更简洁的方法是听你的测试。您的测试告诉您代码存在设计问题。也许你可以解决这些问题。例如,您可以尝试将线程逻辑和执行逻辑分开,以便可以对其进行测试。或者,您可以引入一个接口来使依赖项变得可模拟。


查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信