经过多番对比选择,项目中采用了Jasmine作为Javascript单元测试框架。在实际应用中,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