appium으로 사내 서비스 자동화를 진행하다가, junit report나 surefire report 포맷이 별로라서, 좀 더 새로운 html report를 찾다가 발견한 extent report.


좀 더 이쁘장하고, 결과에 따라 필터링도 된다. 

다만, junit 결과를 자동으로 report로 변환하는게 아니라서, 테스트 이후 결과에 따른 로그를 직접 넣어야 된다. 


selenium이나 appium 자동화에 사용하는 사례도 구글링하면 좀 나오는거 보니, 쓸만한 것 같아 적용하기로 했고, 

실제 ui 자동화랑 api 자동화 업무에 해당 리포트를 사용하고 있다. 


우선, maven 설정을 추가하고,

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


  • 테스트 시작 시점에는 createReport
  • 테스트케이스 시작시점에는 createTest 
  • 테스트 종료시점에 pass/fail/skip 의 결과를 extent report에 작성-> test.log(STATUS.PASS...)


우선 report 생성할때, 설정 내용을 반영하도록 해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static ExtentReports createReport() throws Exception {
    if(extent != nullreturn extent;
 
    String reportFile= new File("target/result.html").getAbsolutePath();
 
    htmlReporter = new ExtentHtmlReporter(reportFile);
    htmlReporter.setAppendExisting(true);
    htmlReporter.config().setChartVisibilityOnOpen(true);
    htmlReporter.config().setDocumentTitle("타이틀적용");
    htmlReporter.config().setEncoding("UTF-8");
    htmlReporter.config().setReportName("리포트제목");
 
    extent = new ExtentReports();
    extent.setSystemInfo("OS""Windows 7");
    extent.attachReporter(htmlReporter);
 
    return extent;
}
cs


테스트 시작시

1
2
3
4
5
@BeforeClass
public static void setUp() throws Exception {
    enableLoggingOfRequestAndResponseIfValidationFails();
    extent = createReport();
}
cs


케이스 실행 시작 시점

1
2
3
4
@Before
public void beforeMethod() throws Exception {
    test = extent.createTest(methodName);
}
cs

케이스 종료 시점

1
2
3
4
@After
public void afterMethod() throws Exception {
    extent.flush();
}
cs

테스트 결과에 따라 리포트 로그를 남겨야 하기에 TestWatcher를 활용.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Rule
public TestWatcher testWatcher = new TestWatcher() {
 
    @Override
    protected void failed(Throwable e, Description description) {
        test.log(Status.FAIL, e.toString());
    }
 
    @Override
    protected void succeeded(Description description) {
        test.log(Status.PASS, "SUCCESS");
    }
 
     @Override
    protected void skipped(AssumptionViolatedException e, Description description) {
        test.log(Status.SKIP, SKIP_MSG);
    }
 
}
cs


대충 이정도 구성해놓으면, 각 테스트케이스 @Test 단위에서는 기존과 같이 자동화 코드를 작성하면 된다.


덧붙여 좀 더 추가해서 신경쓸 부분이 있다면, 

  • test.assignCategory(SuiteName); 등을 추가해서, 카테고리별로 구분해서 보게 할 수 있다.
  • 혹시 retry 를 사용하고 있다면, retry시에는 createTest를 추가할 필요가 없다.
  • report에 screenshot을 추가하고 싶다면, test.log(...).addScreenCaptureFromPath() 를 사용하면 된다.
  • jenkins에 연동할때에는 CSS가 적용될 수 있도록 jenkins에 CSS 관련 설정을 해야 한다.


더 좋거나 쉬운 리포트 라이브러리가 있으면 찾아보겠지만, extent report만으로도 현재까지는 만족.





'QA > Test Automation' 카테고리의 다른 글

SoapUI를 이용한 API 테스트 방법 정리  (0) 2018.01.28
API 테스트 방법  (0) 2018.01.27
Jenkins와 Sonar 연동하기  (0) 2012.07.19
Ant 로 Sonar 수행하기.  (0) 2011.04.12
Sonar 소개  (0) 2011.02.14

하도 오래전에 Jenkins와 Sonar를 연동해봤었는데,

요번에 BMS 프로젝트 진행하면서 Sonar한번 설치할래니 기억이 가물가물..;;


그래서 다시 이곳에 정리하기로 했다. 우선 Jenkins와 Sonar가 설치되어 있다는 가정하에 내용을 정리하겠다.


  1. Jenkins에 Sonar Plugin을 설치해야 한다. 
    • Jenkins 관리 > 플러그인 관리
  2. Maven 관련 설정을 한다. Sonar 자체가 Maven기반으로 동작하기 때문에 Maven설정은 필수다.
    • Jenkins 관리 > Configuration (시스템 설정) > Maven
  3. Sonar 관련 설정을 한다.
    • Jenkins 관리 > Configuration (시스템 설정) > Sonar
  4. Build Job을 생성하고 Build 관련 설정을 한다. 
    1. Build Job > 설정 > Build 관련 설정
      • root pom.xml 을 설정하고, goal에서는 -DskipTests=true를 꼭 넣어준다. sonar에서 test를 수행하기 때문에 저 옵션을 넣지 않으면 test가 두번 수행된다.
    2. Build Job > 설정 > Post-build Actions > Sonar 관련 설정
      • Add post-build action에서 Sonar를 선택하고, Sonar관련 설정을 한다.
      • -Dsonar.projectVersion옵션을 사용하면 Sonar에 version 정보를 전달할수 있다. 옵션을 사용하지 않으면 pom.xml의 <version> 정보가 sonar로 넘어간다. 
  5. Jenkins에서 Build를 수행한다. 연동 완료!


'QA > Test Automation' 카테고리의 다른 글

API 테스트 방법  (0) 2018.01.27
자동화에 extent report 적용하기  (0) 2018.01.22
Ant 로 Sonar 수행하기.  (0) 2011.04.12
Sonar 소개  (0) 2011.02.14
CI(Continuous Integration) 서버 구성안  (0) 2011.02.14
  1. Acid 3 Test http://acid3.acidtests.org/
  2. W3C HTML4 Test Suite http://www.w3.org/MarkUp/Test/HTML401/current/
  3. W3C HTML5 Test Suite http://w3c-test.org/html/tests/harness/harness.htm
  4. HTML 5 Test http://html5test.com
  5. DOM Conformance Test Suite http://www.w3.org/DOM/Test/
  6. W3C XML Test Suite http://www.w3.org/DOM/Test
  7. JIL 1.2.2 Tests
  8. Sputnik Sputnik Sputnik ? JavaScript Conformance http://sputnik.googlelabs.com/
  9. JavaScript tests & Compatibility tables http://robertnyman.com/javascript/
  10. Native JSON TestNative http://robertnyman.com/javascript/javascript-native-json.html
  11. ECMAScript 3 Conformance Test Suite http://kangax.github.com/sputniktests-webrunner/
  12. CSS 2.1 Conformance Test Suite http://test.csswg.org/suites/css2.1/20110323/
  13. CSSCSS 3 Color Conformance Test Suite http://www.w3.org/Style/CSS/Test/CSS3/Color/current/
  14. Quirksmode background Test http://www.quirksmode.org/css/background.html
  15. W3C CSS3 Media Queries Test http://www.w3.org/Style/CSS/Test/MediaQueries/20100726/
  16. W3C CSS3 Selectors Test http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/
  17. CSS3 Selectors Test http://www.css3.info/selectors-test
  18. W3C XHR Test Suite http://tc.labs.opera.com/apis/XMLHttpRequest/
  19. W3C SVG Test Suite http://www.w3.org/Graphics/SVG/WG/wiki/Test_Suite_Overview
  20. DOM Level 1http://dorothybrowser.com/test/android/conformance/dom/level1/core/alltests.html?implementation%3Diframe%26skipincompatibletests%3Dtrue%26contenttype%3Dtext/html
  21. DOM Level 2 Corehttp://dorothybrowser.com/test/android/conformance/dom/level2/core/alltests.html?implementation=iframe&skipIncompatibleTests=true&autoRun=true&contentType=text/html
  22. DOM Level 2 HTMLhttp://dorothybrowser.com/test/android/conformance/dom/level2/html/alltests.html?implementation=iframe&skipIncompatibleTests=true&autoRun=true&contentType=text/html
  23. W3C XHR Test Suite http://tc.labs.opera.com/apis/XMLHttpRequest/testrunner.htm
  24. SVG 1.1 Tiny Test Suitehttp://www.w3.org/Graphics/SVG/Test/20061213/htmlObjectHarness/tiny-index.html
빌드는 maven으로 하고, sonar 구동 및 전체 수행은 ant 로 수행시키는 build.xml 예제.

사내 build에 적용해야 하는데, 아직 미 완성.
좀 더 프로세스를 구체화 시킨 후 적용할 예정이다.

<?xml version="1.0" encoding="UTF-8"?>
<project name="Sonar Ant Project" default="build" basedir="." xmlns:artifact="antlib:org.apache.maven.artifact.ant">
 <property environment="env"/>
 <path id="maven-ant-tasks.classpath" path="${basedir}/lib/maven-ant-tasks-2.1.1.jar"/>
 <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
             uri="antlib:org.apache.maven.artifact.ant"
             classpathref="maven-ant-tasks.classpath" />
 <taskdef resource="net/sf/antcontrib/antlib.xml">
   <classpath>
     <pathelement location="${basedir}/lib/ant-contrib-1.0b3.jar" />
   </classpath>
 </taskdef>
 <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
    <classpath path="lib/sonar-ant-task-1.0.jar" />
 </taskdef>
 <target name="build" depends="mvn,sonar"/>
 <target name="mvn">
   <property name="maven.home" value="${env.M2_HOME}"/>
   <echo message="M2_HOME = ${maven.home}"/>
   <artifact:mvn pom="pom.xml" mavenHome="${maven.home}" fork="true" failonerror="true">
     <arg value="clean"/>
     <arg value="install"/>
     <arg value="-Dmaven.test.skip=true"/>
    </artifact:mvn>
 </target>
 <target name="sonar">
   <tstamp>
     <format property="build.time" pattern="yyyy-MM-dd.hh:mm" locale="en"/>
   </tstamp>
  <!--
  <property file="build.number" />
  <echo message="build.number = ${build.number}"/>
  <buildnumber file="build.number" />
  -->
  <!-- The workDir directory is used by Sonar to store temporary files -->
  <sonar:sonar workDir="." key="org.example:example" version="${build.time}" xmlns:sonar="antlib:org.sonar.ant">
    <sources>
      <path location="${basedir}/common/src/main/java"/>
      <path location="${basedir}/model/src/main/java"/>
      <path location="${basedir}/dao-api/src/main/java"/>
      <path location="${basedir}/dao-hibernate/src/main/java"/>
      <path location="${basedir}/agent/src/main/java"/>
      <path location="${basedir}/manager/src/main/java"/>
    </sources>
    <tests>
      <path location="${basedir}/common/src/test/java"/>
      <path location="${basedir}/model/src/test/java"/>
      <path location="${basedir}/dao-api/src/test/java"/>
      <path location="${basedir}/dao-hibernate/src/test/java"/>
      <path location="${basedir}/agent/src/test/java"/>
      <path location="${basedir}/manager/src/test/java"/>
    </tests>
   <!--
    1. binaries: binaries directories, which contain for example the compiled Java bytecode (optional)
    2. libraries: path to libraries (optional). These libraries are for example used by the Java Findbugs plugin
    <binaries>
      <path location="..." />
    </binaries>
    <libraries>
      <path location="..." />
    </libraries>
   -->
   <!-- list of properties (optional) -->
   <property key="sonar.projectName" value="Sonar Ant Project" />
   <property key="sonar.dynamicAnalysis" value="true" />
   <property key="sonar.jdbc.url" value="jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8" />
   <property key="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver" />
   <property key="sonar.jdbc.username" value="sonar" />
   <property key="sonar.jdbc.password" value="sonar" />
   <property key="sonar.host.url" value="http://192.168.20.34:9000" />
   <property key="sonar.java.source" value="1.6" />
   <property key="sonar.java.target" value="1.6" />
  </sonar:sonar>
 </target>
</project>
sonar를 ant로 구동시키면, modules(sub-projects)가 지원되지 않는 점 때문인지, tree map이 package이름으로 번잡하게 나오고, tangle index 정보가 나오지 않는다. 안타깝다;

CI서버를 어떻게 구축하느냐 고민하면서 자료 검색을 하던 도중에
Sonar라는 것을 알게 되었다.

Sonar는 Codehaus에서 개발한 코드 품질 관리 플랫폼으로, 오픈소스다.

사실 이전에 작성하였던 PMD, Checkstyle, Findbugs, Cobertura, JavaNCSS 등을 Maven에 연동하다가 안되는 것이 많아서, 고민하던 차에 알게된 것이라 더욱 반가웠다.

PMD, CheckStyle, Findbugs, Cobertura등을 이용해서 코드검사, 코드커버리지, 중복도, 복잡도 등의 데이터를 추출해주고,
그 외 품질관련 데이터도 뽑아주기 때문에 수월하게 좋은 데이터를 얻을 수 있다.
 

설치도 간단하고, 사용도 쉬워서
이미 엄청나게 유명할 수도 있겠지만, 국내에서도 많이 사용할 것 같다.

테스트 후 나온 Sonar 결과 화면을 아래 첨부한다. 보시다시피, 왠지 엄청 좋아보인다. Quality Index나 Technical Debt까지 계산해주다니...훗^^

다음에는 Sonar 설치, Hudson 연동 방법, Sonar Profile 설정 방법, Sonar 결과화면의 각 데이터의 의미에 대해서 차례로 등록할 예정이다.

종 류
이 름
관련자료 링크
비 고
빌드서버
Hudson
직관적인 UI와 다양한 plugin을 제공
빌드Tool
Maven
단위테스트
프레임웍
JUnit
정적분석Tool
FindBugs
컴파일된 바이너리(.class) 파일을 분석하여 결함을 찾는 도구
PMD
 FindBugs는 클래스 파일을 분석하는 반면 PMD는 미리 정의한 룰셋을 기반으로 자바코드의 구분을 분석한다.
코드커버리지
Cobertura
 branch 커버리지와 line커버리지를 제공
코딩컨벤션 검사
CheckStyle
코드 중복 검사
CPD
  1. PMD에 포함된 코드중복 도구
  2. 자바뿐 아니라 다른 언어도 지원(C/C++, PHP, 포트란 등)
  3. 프롬프트, 자바스윙, 자바 웹스타트 환경에서 실행할 수 있음
코드 복잡도
검사도구
JavaNCSS
 

'QA > Test Automation' 카테고리의 다른 글

자동화에 extent report 적용하기  (0) 2018.01.22
Jenkins와 Sonar 연동하기  (0) 2012.07.19
Ant 로 Sonar 수행하기.  (0) 2011.04.12
Sonar 소개  (0) 2011.02.14
Continuous Integration 관련 자료 - IBM DeveloperWorks  (0) 2011.01.04

'QA > Test Automation' 카테고리의 다른 글

자동화에 extent report 적용하기  (0) 2018.01.22
Jenkins와 Sonar 연동하기  (0) 2012.07.19
Ant 로 Sonar 수행하기.  (0) 2011.04.12
Sonar 소개  (0) 2011.02.14
CI(Continuous Integration) 서버 구성안  (0) 2011.02.14

+ Recent posts