웹 앱의 스마트폰 테스트 자동화
19395 단어 JenkinsDeviceFarmBTC시AWS
AWS Device Farm 이나 Remote TestKit 등의 서비스가 대상이 됩니다만, 이번은 AWS Device Farm를 이용합니다.
CI 툴은 플러그인이 존재하는 Jenkins를 사용합니다.
필요한 것
Amazon EC2 키 쌍
AWS IAM User(DeviceFarmFullAccess 권한이 부여된 사용자)
Terraform
Jenkins 설치
terraform을 사용하여 EC2에 Jenkins를 설정합니다.
스크립트는 사용자 데이터를 사용하여 Jenkins 설정을 수행합니다.
참고 저장소
bash
$ git clone https://github.com/Thirosue/devicefarm-sample.git
$ cd devicefarm-sample/provisioning/
$ terraform apply -var-file=~/.aws/terraform.tfvars -var 'key_name=[keypair]'
ec2_jenkins.tf
variable "key_name" {}
provider "aws" {
region = "ap-northeast-1"
}
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
filter {
name = "architecture"
values = ["x86_64"]
}
filter {
name = "root-device-type"
values = ["ebs"]
}
filter {
name = "name"
values = ["amzn-ami-hvm-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
filter {
name = "block-device-mapping.volume-type"
values = ["gp2"]
}
}
resource "aws_instance" "jenkins" {
ami = "${data.aws_ami.amazon_linux.id}"
instance_type = "t2.micro"
key_name = "${var.key_name}"
user_data = <<EOF
IyEvYmluL2Jhc2gKCndnZXQgLU8gL2V0Yy95dW0ucmVwb3MuZC9qZW5raW5zLnJl
cG8gaHR0cDovL3BrZy5qZW5raW5zLWNpLm9yZy9yZWRoYXQvamVua2lucy5yZXBv
CnJwbSAtLWltcG9ydCBodHRwOi8vcGtnLmplbmtpbnMtY2kub3JnL3JlZGhhdC9q
ZW5raW5zLWNpLm9yZy5rZXkKCnl1bSBpbnN0YWxsIC15IGdpdCBqZW5raW5zIGph
dmEtMS44LjAtb3BlbmpkawphbHRlcm5hdGl2ZXMgLS1zZXQgamF2YSAvdXNyL2xp
Yi9qdm0vanJlLTEuOC4wLW9wZW5qZGsueDg2XzY0L2Jpbi9qYXZhCgpjaGtjb25m
aWcgamVua2lucyBvbgovZXRjL2luaXQuZC9qZW5raW5zIHN0YXJ0CgpleGl0IDA=
EOF
}
userdata.sh
#!/bin/bash
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y git jenkins java-1.8.0-openjdk
alternatives --set java /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java
chkconfig jenkins on
/etc/init.d/jenkins start
exit 0
Jenkins 관리 콘솔 설정
EC2의 PublicIP를 확인하고 다음에 액세스
http://[IPv4 Public IP]:8080
액세스 후 Jenkins가 잠겨 있으므로 지시에 따라/var/lib/jenkins/secrets/initialAdminPassword를 확인하고 입력하십시오.
Device Farm Plugin 설치
Jenkins-플러그인 관리자에서 aws-device-farm-plugin을 설치.
DeviceFarm AccessKey/SecretKey 설정
Jenkins 관리 화면에 준비한 IAM 사용자의 AccessKey/SecretKey 설정
테스트 코드 작성
다음을 참고로 테스트 코드를 작성한다.
참고 저장소 은 Appium+JUnit을 gradle로 build하고 있다.
SampleTest.java
import com.codeborne.selenide.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Platform;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class SampleTest {
private RemoteWebDriver driver;
@Before
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setPlatform(Platform.IOS);
capabilities.setBrowserName("safari");
driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),
capabilities);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@After
public void tearDown() throws Exception {
driver.quit();
}
public boolean takeScreenshot(final String name) {
String screenshotDirectory = System.getProperty("appium.screenshots.dir", System.getProperty("java.io.tmpdir", ""));
System.out.println(screenshotDirectory);
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
return screenshot.renameTo(new File(screenshotDirectory, String.format("%s.png", name)));
}
@Test
public void runTest() throws Exception {
driver.get("https://www.google.co.jp/");
Thread.sleep(1000);
System.out.println(driver.getTitle());
System.out.println(driver.getPageSource());
driver.findElement(By.id("lst-ib")).sendKeys("AWS DeviceFarm");
driver.findElement(By.id("tsbb")).click();
assertTrue(takeScreenshot("index"));
assertEquals("AWS DeviceFarm", driver.findElement(By.id("lst-ib")).getAttribute("value"));
assertTrue(takeScreenshot("result"));
}
}
build 설정
참고 저장소 는 커스텀 태스크의 installZip에서 DeviceFarm에 upload 파일을 생성한다.
task installZip(dependsOn: ["clean", "packageTests", "installDist"]) << {
new File("build/work").mkdir()
new File('build/zip.sh') << 'cd build/work; zip -r zip-with-dependencies.zip .'
copy{
from "build/install/test/lib/"
into "build/work/dependency-jars/"
}
copy{
from "build/libs/test-1.0-SNAPSHOT-tests.jar"
into "build/work/"
}
"chmod 755 build/zip.sh".execute().waitFor()
"build/zip.sh".execute().waitFor()
copy{
from "build/work/zip-with-dependencies.zip"
into "build/"
}
}
DeviceFarm 테스트 설정
작성된 DeviceFarm Project 및 DeviceFarm Device Pool을 선택하여 build로 굳은 zip 파일을 지정합니다.
테스트 실행
Jenkins에서 테스트 실행 후 DeviceFarm 관리 콘솔에 대한 보고서 링크 등이 Jenkins의 테스트 결과 화면에 표시됩니다.
기타 (개발 중 테스트 정보)
54.244.50.32~54.244.50.63.의 IP 범위를 화이트리스트에 등록 그러면, 개발중 자원도 테스트할 수 있을 것 같습니다.
끝에
이용 사례가 적다고 합니다만, 꽤 사용할 수 있는 서비스이므로, 향후 적극적으로 이용해 가고 싶습니다.
Reference
이 문제에 관하여(웹 앱의 스마트폰 테스트 자동화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takeshi_hirosue/items/c7f6a65f57ef86e688a3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)