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");