3.7.3 超市结账第三回合:人性化设计的进一步探索

当小八将最新的测试报告发给收银员们后,本以为大家会为优化后的结果感到满意,却没想到收银员们纷纷反馈:“测试强度太高了,我们根本吃不消!” 在实际工作中,收银员们需要适当的休息,即使是在岗位上。因此,大家对测试结果依然持怀疑态度,要求在设计测试用例时增加休息时间。

一位收银员提议:“在现有的三个阶段基础上,增加一个休息阶段。规则是:如果一个收银员连续工作超过 30 分钟,就休息 2 分钟。” 然而,这个提议刚说完,就有人提出了反对意见:“这个休息时间只考虑了男性收银员的需求,女性收银员需要更多的休息时间,至少 5 分钟。”

经过一番坦诚而友好的讨论,小八决定采纳员工的意见:男性收银员每连续工作 30 分钟,休息 2 分钟;女性收银员每连续工作 30 分钟,休息 5 分钟。小八超市共有 2 名男性收银员和 6 名女性收银员,这一调整充分考虑了员工的实际情况。

于是,测试用例需要再次调整,改动点包括:

  1. 增加收银员的性别属性,并设置对应的休息时间。
  2. 增加收银员休息阶段,根据需求实现休息功能。

首先,在多线程任务类中增加以下属性:

/**
 * 性别,1:男,2:女
 */
public int sex;

/**
 * 单次休息时间,单位分钟
 * 男性员工:2分钟;女性员工5分钟
 */
public int restTime;

/**
 * 最大工作时间,单位分钟
 */
public int maxWorkTime;

/**
 * 上一次开始工作时间,毫秒时间戳
 */
public long lastStartWorkTime;

然后,修改构造方法以初始化这些属性:

/**
 * 构造方法
 * @param totalNum 执行的总次数
 * @param sex 性别
 */
public SupermarketCheckoutTaskThird(int totalNum, int sex) {
    this.totalNum = totalNum;// 设置执行的总次数
    this.costTime = new ArrayList<>(totalNum);// 初始化耗时收集集合类容量
    this.sex = sex;// 设置性别
    this.maxWorkTime = 30;// 设置最大工作时间
    this.restTime = sex == 1 ? 2 : 5;// 设置单次休息时间
    priceCostTime = new AtomicLong();// 初始化计价耗时统计
    payCostTime = new AtomicLong();// 初始化支付耗时统计
    packCostTime = new AtomicLong();// 初始化打包耗时统计
}

before() 方法中设置最近一次工作时间:

/**
 * 前置处理
 */
@Override
public void before() {
    super.before();
    lastStartWorkTime = System.currentTimeMillis();// 设置开始工作时间
}

接下来,设计收银员休息阶段的 rest() 方法:

/**
 * 休息
 */
public void rest() {
    long timeMillis = System.currentTimeMillis();// 当前时间
    if (timeMillis - lastStartWorkTime > maxWorkTime * 60 * 1000) {
        ThreadTool.sleep(restTime * 60 * 1000);// 休息
        lastStartWorkTime = System.currentTimeMillis();// 设置开始工作时间
    }
}

最后,将 rest() 方法嵌入到 test() 方法中,确保收银员在工作过程中能够按时休息。

通过这次改进,小八不仅优化了测试用例,还进一步体现了对员工的关怀。技术测试的最终目的是为了提升效率和用户体验,但在这个过程中,绝不能忽视人的需求。只有让员工在舒适的状态下工作,才能真正实现效率与人性化的双赢。

FunTester 原创精华
【连载】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
白盒、工具、爬虫、UI 自动化
理论、感悟、视频


↙↙↙阅读原文可查看相关链接,并与作者交流