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

上一篇 / 下一篇  2012-07-10 09:28:06 / 个人分类:杂谈

51Testing软件测试网/k||8X-tp i

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

*VXuD5J@0

6bz^+] d7we0  接口测试原则51Testing软件测试网J NV2wLs}8iB W\#yL

?y"s4GG%pt0  1、用例代码简单,只覆盖单个场景,不能写判断,如if怎样,则这判断什么,否则判断什么。尽量不catch异常,使用时要配置fail断言一起使用。51Testing软件测试网B+Tq m&Sb

1R[E+ST NK1[O0  2、接口测试代码做到只依赖被测试接口,不要准备数据或者验证数据时调用你还不能完全信任的系统接口(这点可能会有很多争议)。51Testing软件测试网!]%kv1|1i!Xx6eU:e

51Testing软件测试网j?6}5X[?hV&D

  3、接口要操作数据不能依赖数据库原有的数据,接口产生的数据必须清理。51Testing软件测试网$y ZMOz]6{X

51Testing软件测试网3@9w)J'r6N t*|4R G

  4、对于接口返回要通过断言进行验证,必须做到用例设计要求。51Testing软件测试网4IF$t&K]kS\

51Testing软件测试网x$D8R.ETY7T`(Isu

  5、Mock的原则是为了把测试的重点与精力放到我们代码逻辑上来,mock的目标就是成功模拟场景。

'@O[(]/Pbx.r y-{0

e@R9`5^1U S:X$`0  他的问题和我提的第一个原则有关,是关于测试代码中的含有if的问题,他觉得一些数据校验的方法,实在是太乱了,不好维护。

#bgdQ^0

5u"l P2`(S.W0  我研究了一下他发给的代码,有两种情况,第一种51Testing软件测试网 pr G8F Y8z

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"));}。。。}
51Testing软件测试网Y Zp~/U/h%u

  对于这类来讲,由于判断的值是我们调用传递的,是明确知道值的,所以问题不大,一般这种我一般会这样写51Testing软件测试网cj5DdW'@

assertThat(getConfirmStatus(), equalTo("1"));

~C9ztq:s'S#x0  下面代码是封装了返回状态的方法51Testing软件测试网 B)Y)CCg3m

String getConfirmStatus() {String resultSql = "select * from wlb_order_item where id =" + itemId;Map sqlMap = wlbJdbcTemplate.queryForMap(resultSql);return sqlMap.get("confirm_status").toString()}
51Testing软件测试网0Ihm2JnP!M~Re

  还有一类:

p&_-n^ uqNx&qk)s0
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 ptionalPropertiesMap = 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(""));}}}

Y0k @|%Q"c$V%`s0  这段中含有 if (orderDetail.getPackageWeight() != null)

$n h'B |5i9Pt0

kT+{Y1I0  因为这个判断的值 orderDetail是接口调用后返回的,根据这个返回值的情况再去判断,就比较危险了,一般对我们的case来讲,我们必须要明确这个返回值是什么的。当出现返回值不是你期望的结果时,用例就可能发挥不出他的作用了。

oz-ngl(wpK#`0

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

A3|)CU C*j x1s051Testing软件测试网VC"kS,r"EB`6|

  举个简单的例子51Testing软件测试网$XX]m `Ab

51Testing软件测试网8M?Q+? `cM

  我们要测试这样一个方法 int add(a,b)51Testing软件测试网 t*t4}y^;Wfh

51Testing软件测试网-sHo5[2E n

  我们的正确的断言应是 assertEquals(add(1+2),3),而不是assertEquals(add(1+2),validAdd(2+1))

)t:w^@7H0

TAG:

 

评分:0

我来说两句

Open Toolbar