JS学习之保存Jasmine测试结果到文件

经过多番对比选择,项目中采用了Jasmine作为Javascript单元测试框架。在实际应用中,Jasmine也不负众望,很好的满足了测试需求。Jasmine测试结果展现的也比较直观,如下所示:
Jasmine测试结果
测试通过的用例用绿色的点表示,失败的用例用红色的小叉叉表示,接下来有失败用例的详细信息。这具备了测试报告所需的完整信息。那么问题来了,这个测试结果是即时运行得出的结果。首先,他只显示在被测试终端上。其次,为了看到这个结果,不得不把整个测试用例完整跑一遍,如果测试用例比较多,跑起来比较耗时,就比较麻烦了。

想象一个场景:当你写完最后一个测试用例,并且运行无误,兴致冲冲地和老大说,测试用例写完了,测试通过。结果老大回一句,把测试结果发到我的邮箱,这个时候你估计要傻眼了吧。总不能和老大说,测试结果只能现场看吧。

因此,我们有必要将jasmine的测试结果写入到一个文件中,而且最好是xml或者JSON这样的格式化信息。好在网上有大神已经想到有这个需求,并给出了解决方案。比较好的一个开源项目是jasmine-reporters,里面包含了好几种输出格式,适应不同的测试环境。在项目中,我们使用最简单的JUnitXmlReporter,生成的是JUnit风格的xml文件。

下面以Android平台为例,说明生成Jasmine测试报告的方法。

  • 确定文件输出的位置

为了方便后续对生成的xml文件进行处理,可以将文件输出路径定在SD卡上。即使终端没有SD卡也没有关系,因为Android系统会使用内部存储模拟出一个SD存储卡。最好再指定一个特定的目录,比如:/sdcard/js_jasmine/。然后在SpecRunner.html加入如下js代码:

        jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
            savePath: '/sdcard/js_jasmine/',
            consolidateAll: false
        }));
  • 实现WriteFile方法

这个方法需要注入到WebView中,作为Javascript对象的方法,其作用就是将jasmine测试过程的测试信息写入到文件。

public class Phantom {
    private final static String TAG = "Phantom";
    public Phantom() {
        File root = android.os.Environment.getExternalStorageDirectory();

        File dir = new File(root.getAbsolutePath() + "/js_jasmine");
        dir.mkdirs();
    }

    @android.webkit.JavascriptInterface
    public void writeFile(String fileName, String text) {
        File file = new File(fileName);

        try {
            FileOutputStream f = new FileOutputStream(file);
            OutputStreamWriter writer = new OutputStreamWriter(f);
            writer.write(text);
            writer.close();
            f.flush();
            f.close();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
  • 注入javascript对象
webview.addJavascriptInterface(new Phantom(), "phantom");

经过上述的过程,再运行Jasmine测试用例,在终端的/sdcard/js_jasmine/下就会生成一些xml文件,每个测试套件(testsuite)会生成一个xml文件,文件内容差不多有如下形式:

<?xml version="1.0" encoding="UTF-8" ?>
<testsuites>
 <testsuite name="AsyncTest" timestamp="2017-02-15T15:07:54" hostname="localhost" time="0.014" errors="0" tests="1" skipped="0" disabled="0" failures="0">
  <testcase classname="AsyncTest" name="testAsyncCall" time="0.012" />
 </testsuite>
</testsuites>

如果有很多的测试套件,将会有很多个xml文件,看起来不是很方便。我们可以进一步编写一个脚本,将所有的xml文件pull到host端,使用脚本将这些零散的xml文件合并为一个xml文件,然后通过xsl样式表,展现出来。在我们的项目中,最终的展现效果就如同Android CTS的测试报告。

以上的完整代码可参考我在github上的项目jsdemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水木石

但行好事,莫问前程

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值