37、可观测性和可控性是软件测试的两个重要概念。三位开发人员可以通过提高他们正在测试的系统/类的可观测性或可控性来受益,但每位开发人员都遇到了一个问题。说明每个问题与可观测性还是可控性相关。A开发人员1:“我无法断言正在测试的方法是否运行良好。”B开发人员2:“我需要确保这个类以布尔值设置为false开始,但我做不到。”C开发人员3:“我实例化了模拟对象,但无法将其注入到类中。”
A与可观测性相关;B和C与可控性相关。
38、莎拉加入了一个移动应用团队,该团队一直试图编写自动化测试。团队想为部分代码编写单元测试,但他们告诉莎拉“这很难”。经过代码审查,开发人员列出了代码库中的以下问题:A. 许多类混合了基础设施和业务规则。B. 数据库有大表且没有索引。C. 有大量对库和外部 API 的调用。D. 一些类有太多属性/字段。为了提高可测试性,团队有预算处理这四个问题中的两个。莎拉应该建议他们首先解决哪两项?注意:所有四个问题都应该修复,但要优先考虑最重要的两个。哪两个对可测试性影响最大?
A和C
39、如何提高以下 OrderDeliveryBatch 类的可测试性?public class OrderDeliveryBatch { public void runBatch() { OrderDao dao = new OrderDao(); DeliveryStartProcess delivery = new DeliveryStartProcess(); List orders = dao.paidButNotDelivered(); for (Order order : orders) { delivery.start(order); if (order.isInternational()) { order.setDeliveryDate(“5 days from now”); } else { order.setDeliveryDate(“2 days from now”); } } } } class OrderDao { // 访问数据库 } class DeliveryStartProcess { // 与第三方 Web 服务通信 }
在当前实现中,无法从类外部更改 OrderDao
或 DeliveryStartProcess
对象,因此无法使用模拟对象或桩对象。为了提高可测试性,需要提高可控性。可以考虑使用 依赖注入 ,允许通过构造函数或 setter 方法注入 OrderDao
和 DeliveryStartProcess
的依赖项,这样在测试时就可以使用模拟对象或桩对象。
40、考虑下面的KingsDayDiscount类:public class KingsDayDiscount { public double discount(double value) { Calendar today = Calendar.getInstance(); boolean isKingsDay = today.get(Calendar.MONTH) == Calendar.APRIL && today.get(Calendar.DAY_OF_MONTH) == 27; return isKingsDay ? value * 0.15 : 0; } } 你会怎么做来让这个类更具可测试性?
可以将获取当前日期的操作封装到一个单独的类(如 Clock
类)中,让 KingsDayDiscount
类依赖这个封装类,通过构造函数注入该依赖。这样在测试时可以轻松地对这个依赖进行存根,控制返回的日期,从而测试国王节和非国王节两种情况。
示例代码如下:
import java.util.Calendar;
interface Clock {
Calendar now();
}
public class KingsDayDiscount {
private final Clock clock;
public KingsDayDiscount(Clock clock) {
this.clock = clock;
}
public double discount(double value) {
Calendar today = clock.now();
boolean isKingsDay = today.get(Calendar.MONTH) == Calendar.APRIL
&& today.get(Calendar.DAY_OF_MONTH) == 27;
return isKingsDay ? value * 0.15 : 0;
}
}
41、思考你当前的项目。它的某些部分是否难以测试?你能解释原因吗?你可以做些什么来提高其可测试性?
项目某些部分难以测试的原因及提高可测试性的方法
难以测试的原因
-
代码中领域代