首先声明,这个框架不是我写得,我只是在这里分享下。
多机并行执行、出错获取所有可获取的日志、集成良好的报告,一直是一个良好的 UI 自动化框架的终极目标。最近看到 github 上有开源的框架做到了上述的三个点,不敢独享,在此分享下。
https://github.com/saikrishna321/AppiumTestDistribution
示例项目地址(建议新手也看下,学习下良好的测试用例脚本是如何编写的):
https://github.com/saikrishna321/PageObjectPatternAppium
youtube 视频演示:
https://www.youtube.com/watch?v=KfMoJ6dSC3g
由于不少同学跟帖说使用示例项目启动报错,自己小小尝试了一下,确实有一些坑。在此记录和分享下。
特别注意,我是在 mac 下进行的尝试,不排除 windows 下有些坑 mac 下不会遇到。
Cannot run program "appium"
原因:一查堆栈,可以看到都和 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 。我就是这么解决的。。。
mvn clean -Dtest=Runner test
, 提示 Parameter 'device' is required by @Configuration on method startAppiumServer but has not been marked @Optional or defined
原因:源码中对应 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 个小时左右把这个程序跑通。结合最近团队中的一些情况,有一点小感慨。踩坑是一个积累的过程。技术上遇到问题不是自己去踩坑解决,而是直接提问,那么最终得到提升的只会是回答问题的人。他会在一次次踩坑中积累经验,以后遇到这些问题能快速解决,而提问的人,提升速度会慢很多,因为记忆不深刻,下次遇到还得问或者从零查起。
另外,到目前为止,几乎没遇到过完全没有坑的程序。运行环境千差万别,不可避免不同环境下会遇到不同的问题。当遇到这些问题时,能独立找到原因并解决,甚至分享解决方案的同学,才会成为团队的主力,因为他才是提升团队效率的关键。
纯属感慨,大家不需要对号入座。