流程服务的测试
―――――――――――――――――――――――――――――――――――――――
这几天,我们遇到了一个难题,流程服务的测试进展很慢。
主要的问题体现在哪里呢?
第一,当流程去调用服务时,会发生数据格式的错误,比如一个非空字段填入了空值,时间字段不能带时分秒等等。
第二,因为流程的调用有连贯性,比如一个流程服务在调完了OA系统,等待OA系统的回复,然后再去调用物资系统,如果在调用物资系统时出错,则需要重新测试,又要从OA系统开始。
第三,因为每个系统都是不同的开发商开发的,当发生了问题,首先要确认是谁的问题,然后才能做相应的修改,基本上每个服务都要小修小改。
第四,有一个开发商一定要求客户开具需求变更确认单,签字传真回开发商公司,等开发商的领导确认之后,才能进行修改,这样变更的响应速度就很慢。
第五,每个系统都会有内部流程,比如流程服务调用OA系统,OA系统会启动它内部的审批审批流程,需要人工操作,大约五分钟之后才能回复给流程服务。如果一个流程服务需要调用三个系统,每个系统的内部流程都要运行5分钟,那么这个流程服务的测试周期是15分钟。而且流程服务的测试人员需要协调各开发商的测试人员,通知他们登入系统做操作,运行系统的内部流程。如果开发商的人员有事不在,比如大便去了,就会等待很久。
第一个问题的原因在于开发人员对服务契约研究不够,或者服务开发人员没有严格按照契约开发服务。比如契约中XML元素定义如下:
s:element name="clientRequest">
<s:complexType>
<s:sequence>
<s:element name="age" type="s:int"/>
<s:element name="id" type="s:string" minOccurs="0"/>
</s:sequence>
</s:complexType>
</s:element>
但是客户端送过来的数据会变成
<clientRequest>
<id>mary</id>
<age>116</age>
</clientRequest>
XML元素的顺序不对,或者送一个空值过来。
一般对于一个对XML Schema熟悉的开发人员来说,他会知道应该怎样按照XSD的要求组织数据,但是,我遇到的开发商的开发人员却不知道。
又比如,有一个服务返回数据要求是下列格式:
<m:clientRequest xmlns:m="test.com">
<m:id>mary</m:id>
<m:age>116</m:age>
</m:clientRequest>
在运行环境中,服务返回的是
<ns:clientRequest xmlns:ns="test.com">
<ns:id>mary</ns:id>
<ns:age>116</ns:age>
</ns:clientRequest>
如果是按照XML的方式解析,这两者是完全等同的,可是客户端的开发人员是按照字符串的方式解析,所以他就无法解析服务的返回参数。
我得到的教训就是,在定义完服务契约之后,需要对开发商的开发人员进行提醒,如果他们根本没有XML编程的经验,需要提供培训。
第二个问题,比较难解决,我发现这个问题之后,提出能不能各个系统收到流程服务的消息之后,直接返回一个模拟的数据,让流程能够快速运行下去。各个系统再对收到的消息进行操作测试。可惜的是,时间不允许再做这样的改动了。
第三个问题,是各个开发商的服务单元测试没有认真去做,这和开发人员的责任心有关,在流程服务的测试过程中,我发现流程的错误常常是开发商的服务导致的,但是等待他们修改会浪费流程服务测试的时间。如果提高开发人员的责任心呢,我的建议是只有靠完善监督制度保证。
第四个问题,这是客户的掌控能力问题和商务问题。我只能希望我下个项目不要遇到变更确认单的事情。
第五个问题,我要求流程服务的测试人员学会所有其它系统的操作,他能够登录到别的系统中去启动它们的内部流程,这样能够提高测试效率。