通过TeamCity设置自动启动Android应用程序的UI测试

任何开发自我测试实践的测试人员迟早都会面临自主执行测试的问题。 此外,如果专家经验丰富,那么他将尽早处理此问题。 因此,在首次成功在本地运行自动测试之后,我决定立即在TeamCity中配置启动。

我注意到,在我们公司中,几乎没有关于远程启动Android工具测试的专业知识,因此我不得不努力研究Google,但在那里也没有找到任何详细的指南。 因此,我决定取消这条指令。

在入口处,我们有:

  • 测试在本地成功运行
  • 运行TeamCity服务器
  • Debian上具有KVM和X的服务器

立即关于将在其中启动服务器的免责声明:设置操作系统,硬件虚拟化和图形外壳不是本文的主题,因此将被省略。

安装和配置TeamCity代理


让我们从Java开始。 这里最主要的是选择正确的版本。 我有3个依赖项:测试本身,android工具和teamcity代理。 我停止在版本8上为所有人使用一个JVM。 如果您不太幸运,并且会发生冲突,则必须在同一台计算机上配置使用多个Java版本。 还有一点要注意:如果您有debian,那么首先您需要添加webupd8team存储库(Google速度非常快)。

sudo apt-get install oracle-java8-installer sudo apt-get install oracle-java8-set-default 

接下来,创建一个用户,在该用户下将启动代理,然后启动其他所有用户。 不要忘记设置密码。

 sudo useradd -d /home/tc_agent -s /bin/bash -m tc_agent sudo passwd tc_agent 

可以在您团队的Web界面中进行代理分发。 为此,请转到“ 代理”部分,然后单击右上角的“ 安装构建代理”链接。 下载并解压缩到服务器上所需的文件夹(我建议我们用户的主文件夹- /home/tc_agent )。 接下来,添加运行所有脚本的权限:

 sudo chmod +x /home/tc_agent/BuildAgent/bin/* 

如果您的teamcity版本支持Agent Push,那么它会更容易。 只需在Web界面中打开相应的选项卡,单击Install Agent ...按钮,然后按照说明进行操作即可。

我们配置一个配置。 如果您使用的是远程安装,则说明它已经创建,您只需要在其中指定代理名称即可。 如果没有,则创建:

 cd /home/tc_agent/BuildAgent/conf cp buildAgent.dist.properties buildAgent.properties nano buildAgent.properties 

serverUrl=服务器Web界面serverUrl=地址serverUrl= ,并name=代理name=唯一名称serverUrl= name= 。 如果您有多个代理程序或默认端口(9090)繁忙,请使用ownPort=参数设置您自己的ownPort=

我们/home/tc_agent/BuildAgent/bin/agent.sh start命令/home/tc_agent/BuildAgent/bin/agent.sh start 。 如果一切配置正确,那么我们将在“ 未授权”选项卡上看到我们的代理。 我们授权,您可以使用。

要自动启动代理,请使用以下内容创建/etc/init.d/teamcity_agent脚本:

 #!/bin/bash BINARY="/home/tc_agent/BuildAgent/bin/agent.sh" RUNAS="tc_agent" LOGFILE="/home/tc_agent/BuildAgent/logs/start.log" CMD="$BINARY $1 $2" runuser - "$RUNAS" -c "$CMD > $LOGFILE" cat $LOGFILE 

添加运行sudo chmod +x /etc/init.d/teamcity_agent的权限,并将/etc/init.d/teamcity_agent start行添加到文件/etc/rc.local

控制重新启动,代理已上升,我们继续。

安装Android SDK和模拟器


下载android sdk工具 (仅命令行工具),然后将其解压缩到所需目录中。 创建一个目录来存储将来的AVD图像(应该有足够的空间)。 对我来说,管理员已将主存储库连接到/var,目录/var,我将把所有内容放在那里。 接下来,我们将文件的所有者更改为我们的用户,然后最好在他的领导下完成下一步。

 sudo chown tc_agent -R /var/opt/android-sdk sudo mkdir /var/opt/.android sudo chown tc_agent /var/opt/.android 

添加环境变量。 打开文件/home/tc_agent/.bash_profile进行编辑和编写:

 export ANDROID_HOME=/var/opt/android-sdk export ANDROID_AVD_HOME=/var/opt/.android/avd export PATH=$ANDROID_HOME/platform-tools:$PATH export PATH=$ANDROID_HOME/tools:$PATH 

我们重新启动并验证变量是否在“ 代理程序参数”选项卡上的teamcity Web界面中正确显示。

我们尝试运行sdkmanager: $ANDROID_HOME/tools/bin/sdkmanager --list应列出已安装和可用的软件包。 如果Exception in thread "main" java.lang.NoClassDefFoundError收到诸如Exception in thread "main" java.lang.NoClassDefFoundError类的错误,请尝试此解决方案

安装必要的工具和虚拟机的映像。

 $ANDROID_HOME/tools/bin/sdkmanager emulator platform-tools tools $ANDROID_HOME/tools/bin/sdkmanager 'system-images;android-25;google_apis;x86' 

创建并运行AVD


因此,我们下载了'system-images;android-25;google_apis;x86' (Android 7.1.1)的映像,并基于该映像创建了虚拟设备。 我不会详细介绍avdmanager实用程序的所有可能参数,将以最小可能量显示它:

 $ANDROID_HOME/tools/bin/avdmanager create avd -n avd_name -k "system-images;android-25;google_apis;x86" 

我们传输名称和原始图像(必须事先通过sdkmanager下载)。 如果返回错误,请添加-v标志以查看文本。

我们传递给模拟器。 首先,在SDK目录中检查模拟器,平台,平台工具,系统映像文件夹。 我用双手创建了平台,其余的则是通过sdkmanager安装软件包时创建的。 接下来,检查硬件加速。 应该有这样的答案。

 $ANDROID_HOME/emulator/emulator -accel-check accel: 0 KVM (version 12) is installed and usable. accel 

如果访问/dev/kvm出错,则添加权限:

 addgroup kvm usermod -a -G kvm tc_agent chown root:kvm /dev/kvm 

另外,我仍然需要安装QEMU: sudo apt-get install qemu-kvm
重新登录并再次检查模拟器。

如果一切正常,请尝试运行。 要通过眼睛查看,请通过vnc连接到服务器。 并运行模拟器:

 $ANDROID_HOME/emulator/emulator @avd_name 

将出现以下窗口:


在测试运行期间,我们将在没有图形的情况下运行,因此我们将添加-no-window参数。

在TeamCity中配置构建


我们进入最后阶段-设置测试的自主启动。 我建立了4个步骤。

1.启动模拟器

 nohup /var/opt/android-sdk/emulator/emulator @avd_name -no-snapshot-save -no-boot-anim -no-window -snapshot clean_snap_1 > start_emulator.log 2>&1& 

由于仿真器“锁定”了终端,因此您需要使用nohup实用程序解开进程(可以用另一种方法来完成-您可以自行决定)。 为了以防万一,请将仿真器日志保存到start_emulator.log文件中。 为了运行测试,我创建了一个干净的快照( 有关如何执行此操作,请参见此处 ),并添加了-no-snapshot-save开关,以便不会被覆盖。

2.等待设备启动。

 adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' 

首先,我们等待设备的wait-for-device状态,然后在循环中等待sys.boot_completed变量返回1。

3.运行测试。 这里的一切都是个别的,这是我的例子:

 ./gradlew clean connectedAndroidTest 

4.关闭仿真器。 到目前为止,我已经简单地终止了该过程。

 kill -s 2 `pgrep qemu-system` 

当然,最好在创建模拟器时记住进程ID。 当我们开始在多个线程中运行测试时,这将是必要的,因为这偶然不会“杀死”错误的进程。

就这样,谢谢您的阅读。 如果有经验更丰富的同事提出意见,我将很乐意对手册进行更改。

Source: https://habr.com/ru/post/zh-CN415769/


All Articles