移动测试基础 吐槽开发的代码未自测直接给 QA 测试带来的小烦恼

HelloHalo · 2015年07月01日 · 最后由 恒温 回复于 2015年08月04日 · 2787 次阅读

有时候不禁感叹:QA 的工作就是这样,做得好是你的职责所在,做不好就得背锅等等。。你不做好还有其他选择吗???有时候,更是拿着卖白菜的工钱,操着卖白粉的心。。下面来吐槽下最近遇到的一些小事儿~~,顺便来个个人的自我阶段性总结。

一、背景
现在的团队都是新组过来做新的业务,团队不是很熟,流程相对不规范,时间也相对紧迫。基本上是开发拿到需求,开发,然后匆忙给 QA 测试。然而,没有自测的代码给 QA 测试会给 QA 带来一定的不方便,消耗一定测试时间。

二、原因分析
目前在做的系统是比较复杂,而且各个模块间交互多。为了走敏捷测试和提高测试覆盖率,QA 拿到开发的代码进行测试,如替换测试资源、校对返回数据等。

三、测试
(1)拿到开发的代码打开的页面缺少样式,导致数据排列混乱。具体原因是实际的发布环境不能添加具体的样式,其代码被注释了,测试的时候需要手动开启所注释的代码。页面显示如下图:

开发的注释完整代码为:

<androidDependency>
<![CDATA[test]]>
</androidDependency>
<iosDependency>
<![CDATA[test]]>
</iosDependency>
<jsDependency>
<javaScript name="jquery" version="1.7.0"/>
<javaScript name="qtiSupport" version="v2"/>
<javaScript name="jquery-ui-touch-punch" version="0.2.3"/>
<!--<javaScript name="skin" version="table_wood"/>-->
</jsDependency>

此时需要将这一行解除注释:

<javaScript name="skin" version="table_wood"/>

修改后的代码为:

<androidDependency>
<![CDATA[test]]>
</androidDependency>
<iosDependency>
<![CDATA[test]]>
</iosDependency>
<jsDependency>
<javaScript name="jquery" version="1.7.0"/>
<javaScript name="qtiSupport" version="v2"/>
<javaScript name="jquery-ui-touch-punch" version="0.2.3"/>
<javaScript name="skin" version="table_wood"/>
</jsDependency>

这样就可以将皮肤样式导入,数据有规律的布局。

(2)图片资源加载无法显示,效果图如下:

查看代码才发现,在具体的资源 xml 文件中并没有配置相应的图片,其代码中资源路径不存在工程中,这个阅读代码需要一段时间。。竟然在工程目录下未新建 pics 目录,且代码中还是 demo1、demo2 图片。。不过,阅读后还是能看出一些端倪,此时给相应工程文件目录下新建图片资源,如下图:

在代码中添加对应的图片名称,如下图:

编译后查看图片资源是后加载正常,如下图(只截图部分了,为了不泄漏策划案和 UI、UE):

(3)真正测试的才刚刚开始,需要替换资源的行、列数,多种不同组合进行测试,从 2×1 到 5×5 不等,具体 XML 代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p1 http://www.imsglobal.org/xsd/imsqti_v2p1.xsd"
                identifier="gapMatch" title="Richard III (Take 1)" adaptive="false" timeDependent="false">
    <responseDeclaration identifier="RESPONSE_1-1" cardinality="multiple" baseType="directedPair">
        <correctResponse>
            <value>W G_1_1</value>
            <value>Su G_1_1</value>
        </correctResponse>
        <mapping defaultValue="-1" lowerBound="0">
            <mapEntry mapKey="W G1" mappedValue="1"/>
            <mapEntry mapKey="Su G2" mappedValue="2"/>
        </mapping>
    </responseDeclaration>
    <outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
    <itemBody>
        <gapMatchInteraction responseIdentifier="RESPONSE_1-1" shuffle="false">
            <prompt>
                <p>看图思考,应如何根据食性对水果、蔬菜进行分类?</p>
                <!--<img src="$(ref-path)/edu/esp/assets/6de7bdb0-3e75-4770-8c2b-ae9d4d8f1f28.pkg/21_367046722_IMG_0004.JPG" alt=""/>-->
                <video src="http://sdpcs.dev.web.nd/v0.1/static/edu/esp/assets/060a40c9-6ab1-43b0-b72b-3668f95dff24.pkg/kk_mov.mov" controls="controls"></video>
            </prompt>
            <gapText identifier="W" matchMax="2"><img src="../resources/pics/dome01.png" alt="" /></gapText>
            <gapText identifier="Sp" matchMax="2"><img src="../resources/pics/dome02.jpg" alt="" /></gapText>
            <gapText identifier="Su" matchMax="2"><img src="../resources/pics/dome03.png" alt="" /></gapText>
            <gapText identifier="A" matchMax="3">一段文字</gapText>
            <div class="table_match_content">
                <table>
                    <thead>
                        <tr>
                            <th>   </th>
                            <th>水果</th>
                            <th>蔬菜</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>温性</td>
                            <td>
                                <p>
                                    <gap identifier="G_1_1">
                                        <img src="../resources/pics/dome03.png" alt="" class="table_img"/>
                                        <img src="../resources/pics/dome03.png" alt="" class="table_img"/>
                                    </gap>
                                </p>
                            </td>
                            <td>
                                <p>
                                    <gap identifier="G_1_2"/>
                                </p>
                            </td>
                        </tr>
                        <tr>
                            <td>寒性</td>
                            <td>
                                <p>
                                    <gap identifier="G_2_1"  />
                                </p>
                            </td>
                            <td>
                                <p>
                                    <gap identifier="G_2_2"/>
                                </p>
                            </td>
                        </tr>
                        <tr>
                            <td>热性</td>
                            <td>
                                <p>
                                    <gap identifier="G_3_1" />
                                </p>
                            </td>
                            <td>
                                <p>
                                    <gap identifier="G_3_2"/>
                                </p>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </gapMatchInteraction>
    </itemBody>
    <responseProcessing template="http://www.imsglobal.org/question/qti_v2p1/rptemplates/map_response"/>
</assessmentItem>

需要更改的资源代码部分如下图:

(4)还需要对比实际返回的 XML 数据是否和开发的 API 格式一致以及数据正确性
开发的 API 返回数据规定如下:


<assessmentResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns="http://edu.nd.com.cn/xsd/assessmentResult"
                  xsi:schemaLocation="http://edu.nd.com.cn/xsd/assessmentResult http://nd-schema.dev.web.nd/xsd/assessmentResult.xsd">
    <itemResult>
        <outcomeVariable identifier="completionStatus">
            <value>FAILED|PASSED</value> <!-- 答题结果[正确:PASSED;错误:FAILED] -->
        </outcomeVariable>
        <outcomeVariable identifier="SCORE">
            <value>0</value> <!-- 答题得分[正确:1;错误:0] -->
        </outcomeVariable>
        <responseVariable identifier="duration">
            <candidateResponse>
                <value>19</value> <!-- 答题用时 -->
            </candidateResponse>
        </responseVariable>
        <responseVariable identifier="numAttempts">
            <candidateResponse>
                <value>0</value> <!-- 答题次数 -->
            </candidateResponse>
        </responseVariable>
        <responseVariable identifier="RESPONSE_1-1" cardinality="MULTIPLE" baseType="directedPair">
            <!-- 正确的响应 --->
            <correctResponse>
                <value>W G_1_1</value>
                <value>Su G_1_2</value>
                <value>P G_2_1</value>
            </correctResponse>

            <!-- 用户提交的响应-->
            <candidateResponse>
                <value>Su G_1_1</value>
                <value>W G_1_2</value>
                <value>P G_2_1</value>
            </candidateResponse>
        </responseVariable>
    </itemResult>
</assessmentResult>

实际的返回数据,需要在代码中将数据放在 console 中打印出来,并在 Chrome 下的 Network 下查看,将实际的数据和开发的 API 校对。而有时候,开发并未将数据打印在 console 中,此时就需要 QA 自己能走查代码添加打印出回来的代码:
console.log(resultXML);//将数据打印  
return resultXML;//返回数据 

具体的可参考:JS 中将控制台 log 输出显示到浏览器中 
将实际返回的数据进行校对,具体返回格式如下:

?xml version="1.0" encoding="UTF-8"?>
<assessmentResult>
    <itemResult>
        <outcomeVariable identifier="completionStatus">
            <value>FAILED</value>
        </outcomeVariable>
        <outcomeVariable identifier="SCORE">
            <value>0</value>
        </outcomeVariable>
        <responseVariable identifier="duration">
            <candidateResponse>
                <value>97</value>
            </candidateResponse>
        </responseVariable>
        <responseVariable identifier="numAttempts">
            <candidateResponse>
                <value>2</value>
            </candidateResponse>
        </responseVariable>
        <responseVariable identifier="RESPONSE_1-1" cardinality="multiple" baseType="directedPair">
            <correctResponse>
                <value>W G_1_1</value>
                <value>A G_1_4</value>
                <value>B G_1_5</value>
                <value>Sp G_1_2</value>
                <value>Su G_1_3</value>
            </correctResponse>
            <candidateResponse>
                <value>W G_1_1</value>
                <value>Sp G_1_2</value>
                <value>Su G_1_3</value>
            </candidateResponse>
        </responseVariable>
    </itemResult>
</assessmentResult>

(5)真实的环境需要在 PC Web 和 Web App 上一起测试,有时候在 web 端可以跑通,但在 Web App 上跑不同,开发未做自测。。给 QA 测试带来一定阻碍。。

四、总结
在团队比较新,团队协作又比较多,所开发系统复杂如交互多、技术难,以及时间比较紧迫,团队制度不健全等复杂情况下,QA 测试会受到一定的阻碍。此时,需要 QA 有较强的分析能力、沟通能力、心里承受能力,帮助项目完成。有时候不禁感叹:QA 的工作就是这样,做得好是你的职责所在,做不好就得背锅。。你不做好还有其他选择吗???有时候,就是拿着卖白菜的工钱,操着卖白粉的心。。
哈哈~~
下班后随笔,请大家吐槽!

共收到 10 条回复 时间 点赞

测这样的项目也真是太辛苦了。。。

@wanlik700c 算是吧,不过能力也是一种锻炼,,

这个项目也太蛋疼了。。。

@eurekasaber 得看懂一些代码,还得和开发沟通,因素很多。。。

一心一意奔着吐槽来的……结果被上了一课,挺好~~楼主排版好评

@james88233 操着卖白粉的心,这个不是吐槽么。。。。不过又说回来,若 QA 说不能测,那不是给开发鄙视了,QA 更应该想办法解决,自强不息。

我觉得有点像是给开发擦屁股。。。
这些是比较锻炼能力,但如果每次发版都要做这些就太浪费时间了。这些东西要不就让开发搞,要不就做个程序自动搞。而且这么搞下去部署很容易出各种问题。

个人对应上面那几个问题的建议:

问题 1:拿到开发的代码打开的页面缺少样式,导致数据排列混乱

不能添加样式是什么情况?我表示不能理解。。。如果是没办法改,那就做个脚本来干这活。

问题 2:图片资源加载无法显示

这个完全是开发的问题,把这个目录和代码一起放代码库就可以了。如果实在不能放到代码库(例如线上环境数据和测试环境数据不一样),那就在测试环境搞一份就好了。

问题 3:真正测试的才刚刚开始,需要替换资源的行、列数,多种不同组合进行测试

这部分是接口还是配置文件?如果文件格式比较固定,建议写个小程序来自动替换不同组合对应的 xml(自己预先准备好就行)+ 屏幕截图,然后每次检查屏幕截图就好了。手动改实在是吃力不讨好,还容易出错。

问题 4:还需要对比实际返回的 XML 数据是否和开发的 API 格式一致以及数据正确性

有一种日志级别叫做 debug (console.debug("debug message")),遇到没有加 log 的就加上去并设为 debug 级别的就好了,生产环境把日志级别调高就不会输出这些 log 了。首次添加可能有点累,但好处是一劳永逸,以后就不用加了。至于具体数据格式验证,开发那边应该有对应的解析模块,可以直接取过来做解析看能否正确解析。 xml 如果由人来看速度慢还容易出错。

问题 5:真实的环境需要在 PC Web 和 Web App 上一起测试,有时候在 web 端可以跑通,但在 Web App 上跑不同

这个你没有给具体例子,所以我也不知道具体是什么情况了。如果 web 和 web app 使用同一套代码(特指逻辑处理部分),有可能是前台事件响应的问题,如果不是,那就要看具体情况了。

我觉得要通过改代码解决的问题都可以通过程序来做,毕竟改代码是个技术活,改错了说不定后面就白测了,而且纯文本处理用编程来做也比较简单,说不定以后就可以变成一套部署脚本呢。

而且从上面你提到的这些问题猜测,开发本地会有不少 work copy,说不定某一天 commit 了一个不该 commit 的。。。你懂的。。。

@chenhengjie123 感谢你看完了本文,并给予了很长的回复。
(1)这个样式混乱是因为发布有一个线上 SVN(某个平台),其需要引用其他模块的模糊样式,在线 SVN 不能添加样式代码,QA 通过 TortoiseSVN 拿到的是被注释的样式代码,需要开启注释就行了。
(2)图片确实是开发的问题,因为完全没添加。
(3)这个是类似接口测试,是以 XML 数据形式。这个数据是以按钮点击事件触发数据交互,然后在 Chrome 中查看。确实有想过,当时比较难实现。
(4)对,确实一劳永逸,打印输出。
(5)这边的数据是在 PC 端打一个服务器,然后通过 Web 线路查看,再通过 Web App 连接本地 PC,同步数据。这两个都是测试环境,web app 是模拟真实 App 搭建的一个测试环境。测试通过后,才会集成联调到其他模块,再做集成测试。Web App 上不同跑通是因为没有做适配和代码的判断,因为 Web 端和 Web App 是需要程序区分的。Web 和 Web app 同步数据可以查看下我的这边博客:http://blog.csdn.net/jlhx123456/article/details/46574507
欢迎批评指正。

黑锅小菜鸟报到

@halo_lan 建议不要把公司代码放出来。之前出过一次类似的事情,影响不好。这个其实已经不是开发自测的问题了,是整个过程不行了。当然每个公司都这样。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册