웹 앱의 스마트폰 테스트 자동화

웹 브라우저 응용 프로그램의 스마트 폰 테스트를 외부 서비스를 사용하여 자동화합니다.
AWS Device Farm 이나 Remote TestKit 등의 서비스가 대상이 됩니다만, 이번은 AWS Device Farm를 이용합니다.
CI 툴은 플러그인이 존재하는 Jenkins를 사용합니다.

필요한 것


  • AWS 계정

  • Amazon EC2 키 쌍

  • AWS IAM User(DeviceFarmFullAccess 권한이 부여된 사용자)
  • DeviceFarm Project(테스트 대상 프로젝트)
  • DeviceFarm DevicePool(테스트 대상 단말기 풀)

  • 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 범위를 화이트리스트에 등록 그러면, 개발중 자원도 테스트할 수 있을 것 같습니다.

    끝에



    이용 사례가 적다고 합니다만, 꽤 사용할 수 있는 서비스이므로, 향후 적극적으로 이용해 가고 싶습니다.

    좋은 웹페이지 즐겨찾기