分享

接口测试原则之测试代码中的判断 ? Taobao QA Team

 知识储备库_wucl 2011-08-10

接口测试原则之测试代码中的判断

前几天把我之前整理的接口测试原则发了上来,不过没有人评论,想想估计写的太简单了,没有几个人明白我说什么, 不过前几天有个同学关注到我的这个blog, 还问了我问题,我真是很激动,边把他提的问题与关于这条原则的一些理解,发出来与大家分享。

他的问题和我提的第一个原则有关,是关于测试代码中的含有if的问题,他觉得一些数据校验的方法,实在是太乱了,不好维护。

我研究了一下他发给的代码,有两种情况,第一种

public void doAssertItemConfirmStatus(long itemId, int sign) {
String resultSql = "select * from wlb_order_item where id =" + itemId;
Map sqlMap = wlbJdbcTemplate.queryForMap(resultSql);
if (sign == 1) {
assertThat(sqlMap.get("confirm_status").toString(), equalTo("1"));
} else if (sign == 2) {
assertThat(sqlMap.get("confirm_status").toString(), equalTo("2"));
}
。。。

}

对于这类来讲,由于判断的值是我们调用传递的,是明确知道值的,所以问题不大,一般这种我一般会这样写
assertThat(getConfirmStatus(), equalTo("1"));
下面代码是封装了返回状态的方法

String getConfirmStatus() {
String resultSql = "select * from wlb_order_item where id =" + itemId;
Map sqlMap = wlbJdbcTemplate.queryForMap(resultSql);
return sqlMap.get("confirm_status").toString()
}

还有一类:

public void doAssertWeightAndVolume(FillBackOrderDTO orderDetail, int sign) {
String resultSql = "select * from wlb_order where order_code='"
+ orderDetail.getOrderCode() + "'";
Map sqlMap = wlbJdbcTemplate.queryForMap(resultSql);
if (sign == 1) {
String attributes = sqlMap.get("attributes").toString();
int flag = 0;
Map optionalPropertiesMap = KeyValueParser.parseString2Map(attributes);
if (orderDetail.getPackageWeight() != null) {
assertThat(optionalPropertiesMap.get(OrderConstant.ATT_PACKAGE_WEIGHT).toString(),
equalTo(orderDetail.getPackageWeight().toString()));
}
if (orderDetail.getPackageHeight() != null) {
flag++;
assertThat(optionalPropertiesMap.get(OrderConstant.ATT_PACKAGE_HEIGHT).toString(),
equalTo(orderDetail.getPackageHeight().toString()));
}
。。。
if (flag == 3) {
Double volume = orderDetail.getPackageHeight() * orderDetail.getPackageWidth()
* orderDetail.getPackageLength();
assertThat(optionalPropertiesMap.get(OrderConstant.ATT_PACKAGE_VOLUME).toString(),
equalTo(volume.toString()));
}

} else {
if (sqlMap.get("attributes") == null) {
assertThat(sqlMap.get("attributes"), equalTo(null));
} else {
assertThat(sqlMap.get("attributes").toString(), equalTo(""));
}

}

}

这段中含有 if (orderDetail.getPackageWeight() != null)
因为这个判断的值 orderDetail是接口调用后返回的,根据这个返回值的情况再去判断,就比较危险了,一般对我们的case来讲,我们必须要明确这个返回值是什么的。当出现返回值不是你期望的结果时,用例就可能发挥不出他的作用了。

对于出现这类判断的原因,我想主要在于我们对于预期值的理解上,我们的每个断言,都必须要清楚要比较什么字段,有明确的字段预期值,而测试代码出现 if的原因在于:没有搞清楚预期,如果一个断言要验证什么,还要根据一些情况进行判断,或者预期值还要经过计算,查询数据库之类的操作获得这样其实有出问 题的可能了

举个简单的例子
我们要测试这样一个方法 int add(a,b)
我们的正确的断言应是 assertEquals(add(1+2),3), 而不是assertEquals(add(1+2),validAdd(2+1))

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多