首先声明,这个框架不是我写得,我只是在这里分享下。

前言

多机并行执行、出错获取所有可获取的日志、集成良好的报告,一直是一个良好的 UI 自动化框架的终极目标。最近看到 github 上有开源的框架做到了上述的三个点,不敢独享,在此分享下。

框架地址:

https://github.com/saikrishna321/AppiumTestDistribution

示例项目地址(建议新手也看下,学习下良好的测试用例脚本是如何编写的):

https://github.com/saikrishna321/PageObjectPatternAppium

youtube 视频演示:

https://www.youtube.com/watch?v=KfMoJ6dSC3g

框架特性:

  1. 内置 TestNG 和 Cucumber ,你想 BDD 也能用
  2. 出错自动收集 Appium Server Log、脚本报错堆栈、adb log 、截图,基本满足定位问题的所有需要。
  3. 集成 ExtentReports 作为测试报告,美观好用
  4. 据说还支持视频记录测试过程,不过需要额外安装一些组件 。详情请看框架的 readme

Trouble shooting

由于不少同学跟帖说使用示例项目启动报错,自己小小尝试了一下,确实有一些坑。在此记录和分享下。

特别注意,我是在 mac 下进行的尝试,不排除 windows 下有些坑 mac 下不会遇到。

原因:一查堆栈,可以看到都和 CommandPrompt.runCommand 方法有关。看下源码:

public class CommandPrompt {

    Process p;
    ProcessBuilder builder;

    public String runCommand(String command) throws InterruptedException, IOException {
        p = Runtime.getRuntime().exec(command);
        // get std output
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = "";
        String allLine = "";
        int i = 1;
        while ((line = r.readLine()) != null) {
            allLine = allLine + "" + line + "\n";
            if (line.contains("Console LogLevel: debug") && line.contains("Complete")) {
                break;
            }
            i++;
        }
        return allLine;

    }

这个方法很简单,就是调用 Runtime.getRuntime().exec(command); 运行命令。经过搜索,这个 runtime 运行时的环境变量 和启动这个命令所在窗口能获得的环境变量是一致的 。提示找不到这个文件,意味着环境变量 PATH 里面没有这个程序入口。具体情况需要大家自行查找。

如果是在 shell 或者 bash 下,有个小技巧可以查下运行时的环境变量的值。往示例项目的 src/test/java/com/appium/tests/Runner.java 里面进行如下修改:

package com.appium.tests;

import com.appium.manager.ParallelThread;
// -----------------新加的一个 import 语句-----------------
import com.appium.utils.CommandPrompt;
// -----------------新加的一个 import 语句 end-----------------
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.List;

public class Runner {

    @Test public void testRunner() throws Exception {
        // -----------------新加的输出当前环境变量值的语句-----------------
        CommandPrompt cmd = new CommandPrompt();
        String output = cmd.runCommand("env");
        System.out.println("**********env: " + output);
        // -----------------新加的输出当前环境变量值的语句 end-----------------

        ParallelThread parallelThread = new ParallelThread();
        List<String> test = new ArrayList<String>();
        /*test.add("MultiLoginTest");
        test.add("AddCommentTest");*/
        parallelThread.runner("com.appium.tests");
    }

}

用 maven 运行测试时即可看到环境变量的实际值。

最简单的解决方法:用 npm 重装下 appium 。我就是这么解决的。。。

原因:源码中对应 startAppiumServer 的内容如下:

...
    @BeforeClass(alwaysRun = true)
    @Parameters({"device"})
    public synchronized AppiumServiceBuilder startAppiumServer(String device) throws Exception {
        String methodName = getClass().getSimpleName();
        if (prop.containsKey("CI_BASE_URI")) {
...

此处使用了 testng 的 Parameters 注解,但这个 device 并没有通过参数传递到这个方法。因此报错。

解决方案很简单,运行命令里加入设备的 udid 号传给 device 变量即可。例如我用虚拟机,adb devices 输出如下:

List of devices attached
192.168.56.102:5555 device

那么,我的启动命令改为 mvn clean -Dtest=Runner -Ddevice="192.168.56.102:5555" test 就可以正常启动了。

有一些配置项需要根据运行环境进行修改。具体改动可以参照我的修改内容:

diff --git a/config.properties b/config.properties
index 024d934..5e8295f 100644
--- a/config.properties
+++ b/config.properties
@@ -1,8 +1,8 @@
-ANDROID_APP_PATH=/Users/saikrisv/git/PageObjectPatternAppium/build/wordpress.apk
+ANDROID_APP_PATH=/Users/hengjiechen/Develop/tmp/PageObjectPatternAppium/build/wordpress.apk
 APP_PACKAGE=org.wordpress.android
 APP_ACTIVITY=org.wordpress.android.ui.WPLaunchActivity
 RUNNER=distribute
-APPIUM_JS_PATH=/usr/local/lib/node_modules/appium/build/lib/main.js
+APPIUM_JS_PATH=/Users/hengjiechen/.nvm/versions/node/v4.2.6/lib/node_modules/appium/build/lib/main.js
 BROWSER_TYPE=chrome
 APP_TYPE=NA
 FRAMEWORK=testng

写在解决这些问题的最后

最近都比较忙,到今晚才抽空了 1 个小时左右把这个程序跑通。结合最近团队中的一些情况,有一点小感慨。踩坑是一个积累的过程。技术上遇到问题不是自己去踩坑解决,而是直接提问,那么最终得到提升的只会是回答问题的人。他会在一次次踩坑中积累经验,以后遇到这些问题能快速解决,而提问的人,提升速度会慢很多,因为记忆不深刻,下次遇到还得问或者从零查起。

另外,到目前为止,几乎没遇到过完全没有坑的程序。运行环境千差万别,不可避免不同环境下会遇到不同的问题。当遇到这些问题时,能独立找到原因并解决,甚至分享解决方案的同学,才会成为团队的主力,因为他才是提升团队效率的关键。

纯属感慨,大家不需要对号入座。


↙↙↙阅读原文可查看相关链接,并与作者交流