2019년 7월 18일 목요일

API Test 진행 시 profile 선택 관련 정리 - Maven profile, yaml, lombok

1. jenkins에서 profile 선택하여 빌드 및 테스트 수행
mvn clean test -P ${evn}
env : env는 jenkins의 string parameter나 choice parameter를 이용한다.
ex) evn = qa or release or stage

2. intelliJ에서는

3. 프로파일별 테스트 데이터 관리는 yaml 파일로 관리한다.
 
 yaml file 위치

testdata.yaml
userId : test
password : qwe123

TestData.java
TestData.java는 lombok library를 이용하여 코드를 간결화 한다.
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;

@Getter 
@Setter
public class TestData {
 private String userId;
 private String password;

 @Override
 public String toString() {
  return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
 }

 public TestData getTestData() {
  Yaml yaml = new Yaml();
  InputStream inputStream = TestData.class.getResourceAsStream("/testdata.yaml");
  return yaml.loadAs(inputStream, TestData.class);
 }
}

사용법

TestData testData = new TestData();
testData = testData.getTestData();
RestAssured.baseURI = testData.getTargetURL();

2019년 7월 8일 월요일

TestNG에 ExtentReport 적용하기

1. pom.xml dependency 추가

<dependency>    
  <groupId>com.aventstack</groupId>    
  <artifactId>extentreports</artifactId>    
  <version>3.1.5</version>
</dependency>

2. ExtentManager 추가

public class ExtentManager {
    private static ExtentReports extent;

    public static ExtentReports getInstance() {
        if (extent == null)
            createInstance();
        return extent;
    }

    //Create an extent report instance
    public static ExtentReports createInstance() {
        String reportFile = new File("target/result.html").getAbsolutePath();
        ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(reportFile);
        htmlReporter.setAppendExisting(true);
        htmlReporter.config().setTestViewChartLocation(ChartLocation.BOTTOM);
        htmlReporter.config().setChartVisibilityOnOpen(true);
        htmlReporter.config().setTheme(Theme.STANDARD);
        htmlReporter.config().setDocumentTitle(reportFile);
        htmlReporter.config().setEncoding("UTF-8");
        htmlReporter.config().setReportName(reportFile);

        extent = new ExtentReports();
        extent.attachReporter(htmlReporter);
        extent.setSystemInfo("Environment", "QA");
        TestData testData = new TestData();
        extent.setSystemInfo("Host Name", testData.getTestData().getUri());
        return extent;
    }
}

3. TestListener 추가

public class TestListner implements ITestListener {
    //Extent Report Declarations
    private static final Logger logger = LoggerFactory.getLogger(TestListner.class);
    private static ExtentReports extent = ExtentManager.createInstance();
    private static ThreadLocal<ExtentTest> test = new ThreadLocal<>();

    @Override
    public synchronized void onStart(ITestContext context) {
        logger.debug("Test Suite started!");
    }

    @Override
    public synchronized void onFinish(ITestContext context) {
        logger.debug("Test Suite is finished!");
        extent.flush();
    }

    @Override
    public synchronized void onTestStart(ITestResult result) {
        logger.debug(result.getMethod().getMethodName() + " started!");
        ExtentTest extentTest = extent.createTest(result.getMethod().getMethodName(),result.getMethod().getDescription());
        extentTest.assignCategory(result.getTestClass().getRealClass().getSimpleName());
        test.set(extentTest);
    }

    @Override
    public synchronized void onTestSuccess(ITestResult result) {
        logger.debug(result.getMethod().getMethodName() + " passed!");
        test.get().pass("Test passed");
    }

    @Override
    public synchronized void onTestFailure(ITestResult result) {
        logger.debug(result.getMethod().getMethodName() + " failed!");
        test.get().fail(result.getThrowable());
    }

    @Override
    public synchronized void onTestSkipped(ITestResult result) {
        logger.debug(result.getMethod().getMethodName() + " skipped!");
        test.get().skip(result.getThrowable());
    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
        logger.debug("onTestFailedButWithinSuccessPercentage for " + result.getMethod().getMethodName());
    }
}

4. testng.xml에 추가
<suite name="TestNG Suite Name">
    <listeners>
        <listener class-name="com.xxxx.utils.listners.TestListner" />    
    </listeners>
    <test name="full_test">
         <packages>
             <package name="com.xxx.test.*" />
         </packages>
     </test>
</suite>

2019년 7월 2일 화요일

Jenkins Parameter를 java code로 받아오는 방법

1. Jenkins 구성에서 General탭의 "이 빌드는 매개변수가 있습니다." 체크
2. String parameter 등의 매개변수 추가
3. Build 옵션에서 Goal and options에 추가한 파라메터를 추가
-> clean test -D자바코드에서사용할파라메타=$젠킨스에서추가한파라메타
=> ex) clean test -DdeviceName=$deviceName -Dversion=$version

4. Java code에서는
String DEVICENAME = System.getProperty("deviceName");
String VERSION = System.getProperty("version");

2019년 6월 28일 금요일

Jenkins API를 이용한 원격 빌드 방법

시나리오
1) 해당 레포지토리를 빌드하는 Jenkins(A)와 API Test를 하는 Test용 Jenkins(B)가 있다.
2) A에서 빌드가 완료되고 서버의 인스턴스가 올라오면 B에서 테스트가 자동으로 시작된다.
즉, 물리적인 장비가 다르다.

위 시나리오에 맞춰 Jenkins를 구성할 때 아래의 방법을 이용한다.

1. B에서 해당 계정(빌드를 수행할 계정)의 API Token을 얻어온다.
  • http://JENKINS_URL/me/configure 에 접속
  • API Token 란의 show Legacy API Token 클릭(add new token 해도 된다.)
2. A에서 Post Step 란에 Excute Shell을 클릭하고 아래의 URL을 입력한다.
  • http://JENKINS_URL/job/JOBNAME/build or http://JENKINS_URL/job/JOBNAME/buildWithParameters
  • /build 와 /buildWithParameters의 차이 : 빌드 시 parameter 유무
  • ex: curl -d  "branch=master&env=qa" http://JENKINS_URL/job/JOBNAME/buildWithParameters?token=API_TOKEN
3. B에서 빌드 유발에서 "빌드를 원격으로 유발" 클릭하고 Authentication Token에 API Token을 입력한다.


2018년 11월 1일 목요일

Mentimeter PPT 실시간 설문

1. https://www.mentimeter.com 무료 회원가입
2. 새로운 프리젠테이션 만들기
3. 타입선택
4. 컨텐츠 선택
5. 완료
- configure 화면에서 Export & Share 탭으로 이동하면 투표 주소나 프리젠테이션 URL을 볼 수 있다.
- 설문(투표)가 완료되었다면 투표 대상이 되는 사람들에게 위 Voting URL이나 menti.com 접속 후 프리젠테이션 상단의 코드를 입력하면 설문에 응할 수 있다. 물론 설문 페이지도 URL로 공유가 가능하며, 실시간으로 반영됨

6. PPT 플러그인 세팅하기
https://appsource.microsoft.com/en-us/product/office/WA104379261?src=office&corrid=56588534-9443-417c-af78-3feb0ac66af3&omexanonuid=91142dce-b142-477a-baca-f29fd4370521
GET IT NOW(로그인 해야함)
7. PPT 실행 후 삽입 > 내앱 에서 Mentimeter 선택

2018년 10월 29일 월요일

Json schema test 방법

1. Json Shechma 생성
https://jsonschema.net/#/
Number Type에 대해 체크
2. 생성된 스키마에서 required 부분 확인할 것
-> API 명세에서 response에 대한 필수값이 체크되지 않았으면 json schema 에서 required 부분을 꼭 확인하여 필수값이 아닌 키값에 대해서 삭제해주자.

3. RestAussured 확인
 1) 1번에서 생성한 스키마를 test/resources 에 json 파일로 저장
 2) .body(matchesJsonSchemaInClasspath("cancellations_json_schema.json"))

4. Postman 확인
 1) 1번에서 생성한 스키마를 enviornment에 저장
 2) pm.test("schema check", function(){
    pm.expect(tv4.validate(pm.response.json(), pm.environment.get("cancel_schema"), false, true), tv4.error).to.be.true;
})

2018년 10월 4일 목요일

젠킨스에서 외부 리포트 사용 시 보안정책 해결 방법

젠킨스에서 외부에서 생성된 리포트 사용 시 보안정책에 의해 css 적용이 안된다.

디폴트 룰 셋은 아래와 같다.














해결방법
jenkins.xml에 service arguments에 아래의 옵션을 추가한다.
"-Dhudson.model.DirectoryBrowserSuppert.CSP="