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="


2018년 9월 4일 화요일

Mac에서 개발환경 세팅하기 - Maven, GIT

Maven 설치 및 환경변수 설정하기

https://maven.apache.org/download.cgi 에 접속한 후 apache-maven-3.5.4-bin.zip 파일을 클릭하여 다운로드 한다.


적당한 곳에 압축을 푼 다음 .bash_profile에 maven 환경 변수 설정해준다. 환경변수 설정 방법은 xxxx을 참고하자.
저는 /Users/아이디/Applications/Maven 이라는 폴더를 만들고 거기에 압축을 풀고 환경변수를 세팅했습니다.


#Java setting
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
PATH=${PATH}:$JAVA_HOME/bin
export JAVA_HOME
export PATH

#Maven setting
M2_HOME=/Users/seokchang/Applications/Maven/apache-maven-3.5.4
PATH=${PATH}:$M2_HOME/bin
export M2_HOME
export PATH

확인하기
echo $M2_HOME, echo $PATH, mvn -version을 차례로 입력하여 제대로 추가되었는지 확인하자


settings.xml 옮기기

settings.xml 파일을 사용자 위치의 .m2 폴더로 이동시킨다.
터미널 실행
mkdir ~/.m2(.m2 폴더가 없으면 mkdir 명령어로 폴더를 생성한다)
해당 위치에서 open . + 엔터 실행 시 그 위치에서 Finder가 실행된다.
다운로드 폴더에 저장된 settings.xml을 .m2폴더로 옮긴다.

GIT 설정

MAC에는 기본적으로 GIT이 기본 설치되어 있다. 기본으로 설치된 것을 사용하거나 업그레이드 하는데 여기서는 기본으로 설치된 것을 사용하는 것으로 가이드를 하고자 한다.
아래와 같이 설정해야 경로에 한글이 들어갈 경우 깨지지 않는다. git global에 사용자를 추가하면서 한글경로 사용할 수 있도록 세팅하자.
git config --global user.name "Your Name"
git config --global user.email "you@your-domain.com"
git config --global core.precomposeunicode true
git config --global core.quotepath false

Mac에서 개발환경 세팅하기 - Java

개요

맥을 처음 써보는 입장에서 테스트 자동화를 진행하기 위해 개발환경 세팅한 내용을 정리했습니다.
아시는 분은 뒤로가기 해주시고요, 저처럼 맥알못인 분들에게는 좋은 자료가 되었으면 합니다.

Java 설치 및 환경변수 설정

JDK 다운로드 및 설치

에 접속한 후 Mac OS X x64 항목을 클릭하여 다운로드 한다.
















jdk-8u181-macosx-x64.dmg 더블클릭 하면 아래와 같은 화면이 나타나고 다시 더블 클릭하여 설치를 시작한다.




















설치 버튼을 클릭하면 아래와 같이 Mac사용자 암호 입력란이 뜨는데 암호를 입력하고 '소프트웨어 설치' 버튼을 클릭한다.













Mac사용자 암호 입력란이 뜨는데 암호를 입력하고 '소프트웨어 설치' 버튼을 클릭한다

















설치 완료!!

Java 환경변수 설정하기


.bash_profile이 없는경우
f
















1) 스포트 라이트 단축키 : control + spacebar
2) terminal 입력 후 ls -al 엔터
3) .bash_profile이 없는 것을 확인하고 터미널 창에 sudo nano .bash_profile 입력 후 엔터
4) 맥OS의 비밀번호를 입력하고 엔터
5) 원래 아무것도 없는 빈 공간 입니다. 여기서 control + o -> Enter -> control + x
6) 다시 ls -al 입력 후 엔터치면 .bash_profile이 생성된 것을 확인할 수 있다.

Java 설치 경로 확인하기

java가 설치된 경로는 /Library/Java/JavaVirtualMachines/ 이다. 여기로 이동하여 자바 버전을 확인하고 .bash_profile에 JAVA_HOME 변수를 추가한다.

터미널 실행 → cd /Library/Java/JavaVirtualMachines/ + 엔터 → ls + 엔터

.bash_profile에 JAVA_HOME 변수 추가하기
터미널 실행 후 vi .bash_profile + 엔터 한 후 아래 그림과 같이 입력해준다.

입력 방법

vi 실행하면 보기모드이므로 i를 눌러 입력 모드로 전환한 후 아래 텍스트를 복붙해준다. 완료되면 esc키 눌러 보기모드로 전환한 후 shift+; 입력하여 나가기 모드로 전환한다.
나가기 모드에서 wq 입력하고 엔터키를 누르면 저장이 완료된다.(저장이 안되는 경우 wq!로 하면 된다)


JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
PATH=${PATH}:$JAVA_HOME/bin;
export JAVA_HOME
export PATH

저장이 완료되었으면 커맨드 화면인데 여기서 source .bash_profile을 입력하고 엔터키 입력하여 환경변수 설정을 완료한다.

환경변수 확인

echo $JAVA_HOME, echo $PATH 를 입력하여 실제로 잘 반영되었는지 확인한다.

2018년 8월 27일 월요일

모바일 자동화 tip - Android

appPackage, appActivity 찾기

  1. adb shell
  2. dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’
또는 adb logcat
실행 확인(cmd execution check)
:/> adb shell am start -n {appActivity}

디바이스 무선 연결
adb tcpip 5656
adb connect IP:5656
adb -s <device name> tcpip 5657 (2대 이상인 경우 device name 지정)

TestNG에서 테스트 순서 제어하기


public class TestNGTest3 {
 
    @BeforeClass
    public void beforeclass(){
        System.out.println("@BeforeClass TestNGTest3");
    }
     
    @Test
    public void test7(){
        System.out.println("test7");
        Assert.assertTrue(true);
    }
     
    @Test
    public void test2() throws Exception{
        System.out.println("test2");
        Assert.assertTrue(true);
    }
     
    @Test
    public void test15() throws Exception{
        System.out.println("test15");
        Assert.assertTrue(true);
    }
     
    @AfterClass
    public void afterclass(){
        System.out.println("@AfterClass TestNGTest3");
    }
}
[결과]

@BeforeClass TestNGTest3
test15
test2
test7
@AfterClass TestNGTest3
PASSED: test15
PASSED: test2
PASSED: test7


public class TestNGTest1 {

    @BeforeClass

    public void beforeclass(){
        System.out.println("@BeforeClass TestNGTest1");
    }

    @Test
    public void test12() throws Exception{
        System.out.println("Test12");
        Assert.assertTrue(true);
    }

    @Test
    public void test5(){
        System.out.println("Test5");
        Assert.assertTrue(true);
    }

    @Test
    public void test3(){
        System.out.println("Test3");
        Assert.assertTrue(true);
    }

    @AfterClass
    public void afterclass(){
        System.out.println("@AfterClass TestNGTest1");
    }
}
[결과]

@BeforeClass TestNGTest1
Test12
Test3
Test5
@AfterClass TestNGTest1
PASSED: test12
PASSED: test3
PASSED: test5

[해결책]

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestNG Suite Name">
    <test name="TestNGTest" preserve-order="true">
        <classes>
            <class name="testng.TestNGTest1">
                <methods>
                    <include name="test3" />
                    <include name="test5" />
                    <include name="test12" />
                </methods>
            </class>

            <class name="testng.TestNGTest3">
                <methods>
                    <include name="test2" />
                    <include name="test7" />
                    <include name="test15" />
                </methods>
            </class>
        </classes>
    </test>
</suite>
[설명]
testng의 suite 파일에 preserve-order='true' 를 설정하고 해당 클래스의 test method의 순서를 지정해주면 된다.

[결과]
@BeforeClass TestNGTest1
Test3
Test5
Test12
@AfterClass TestNGTest1
@BeforeClass TestNGTest3
test2
test7
test15
@AfterClass TestNGTest3

※ 위 순서대로 사용하려면, dependsOnMethod를 사용하시면 안됩니다.

TestNG에서 2개 이상의 assert를 한꺼번에 처리하는 방법

개요

"@Test" 메소드에서 테스트 할 때 부득이하게 assert를 여러 번 해야 할 경우가 있다.
이 때 한꺼번에 처리해주지 않으면 첫번 째 assert에서 fail이 발생할 경우, 그 아래에 있는 assert 구문을 처리하지 않고 테스트가 종료되어 남아있는 assert 구문을 확인할 수 없다.
이를 해결하기 위한 방법을 정리한다.

내용

TestNG에서는 Hard assert / Soft Assert로 구분한다.
Hard Assert는 assert 시 fail이 발생하면 해당 테스트를 종료하는 것이고,
Soft assert는 assert 시 fail이 발생해도 로그에서는 fail이지만 테스트 결과는 pass로 해준다. 최종 결과를 확인하기 위해서는 아래와 같이 사용해야 한다.

Hard Assert


@Test
public void hardAssertTest(){
   Assert.assertFalse(2<1);
   System.out.println("Assertion Failed in Test 1");
   Assert.assertTrue(1<0);
   System.out.println("Assertion Failed in Test 2");
   Assert.assertEquals("Sample", "Sample");
   System.out.println("Assertion Passed in Test 3");
}
결과
Assertion Failed in Test 1
FAILED: hardAssertTest1
java.lang.AssertionError: expected [true] but found [false]
at org.testng.Assert.fail(Assert.java:94)
at org.testng.Assert.failNotEquals(Assert.java:513)
at org.testng.Assert.assertTrue(Assert.java:42)
at org.testng.Assert.assertTrue(Assert.java:52)
at testng.TestNGTest2.hardAssertTest1(TestNGTest2.java:13)
...
3번 line : PASS, 5번 line : FAIL이 발생하여 7번line의 assert를 하지 않고 hardAssertTest()의 테스트를 종료하고 빠져나온다. 테스트의 최종결과는 FAIL

Soft Assert 1


@Test
public void softAssertTest1(){
   SoftAssert sa= new SoftAssert();
   sa.assertTrue(2<1);
   System.out.println("Assertion Failed1");
   sa.assertFalse(1<2);
   System.out.println("Assertion Failed2");
   sa.assertEquals("Sample", "Failed");
   System.out.println("Assertion Failed3");
}
결과
Assertion Failed1
Assertion Failed2
Assertion Failed3
PASSED: softAssertTest1
assert는 fail이지만 테스트 결과는 PASS로 된다.

Soft Assert 2


@Test
public void softAssertTest2(){
   SoftAssert sa= new SoftAssert();
   sa.assertTrue(2<1);
   System.out.println("Assertion Failed1");
   sa.assertFalse(1<2);
   System.out.println("Assertion Failed2");
   sa.assertEquals("Sample", "Failed");
   System.out.println("Assertion Failed3");
   sa.assertAll();
}
결과
Assertion Failed1
Assertion Failed2
Assertion Failed3
FAILED: softAssertTest2
java.lang.AssertionError: The following asserts failed:
expected [true] but found [false],
expected [false] but found [true],
expected [Failed] but found [Sample]
at org.testng.asserts.SoftAssert.assertAll(SoftAssert.java:43)
at testng.TestNGTest2.softAssertTest2(TestNGTest2.java:54)
....
SoftAssert 객체를 생성한 후 - SoftAssert sa = new SoftAssert();
SoftAssert 객체로 assert를 모두 진행하고 난 뒤, 마지막에 "sa.assertAll()" 을 해주면 하나라도 fail이 발생 시 최종 테스트 결과는 FAIL로 된다.
assert를 모두 확인하고 테스트를 종료하므로 테스트 메소드에 assert 구문이 여러 개 일 경우 SoftAssert의 assertAll을 사용하자.

Logback 사용법

SLF4J란, Simple Logging Facade for Java의 약자로 Log4J의 개발자 Ceki Gülcü가 LogBack과 함께 개발한 Logging Facade 즉, 로깅에 대한 인터페이스 모음이라고 볼 수 있습니다.
LogBack이 바로 SLF4J의 Native 구현체이며 SLF4J를 사용하여 로깅 처리를 하면 실제 로그는 LogBack에서 출력하게 됩니다.
SLF4J에 대해 좀 더 자세히 알고 있으시면 공식 사이트(https://www.slf4j.org/) 에서 확인하세요
그리고 LogBack에 대한 메뉴얼은 https://logback.qos.ch/manual/index.html 에서 확인 가능합니다.

준비물

1.pom.xml에 logback 관련 의존성 추가

<dependencies>
   <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
      <exclusions>
         <exclusion>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
         </exclusion>
         <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
         </exclusion>
         <exclusion>
            <artifactId>common-logging</artifactId>
            <groupId>common-logging</groupId>
         </exclusion>
      </exclusions>
   </dependency>
   <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
      <exclusions>
         <exclusion>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
         </exclusion>
         <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
         </exclusion>
         <exclusion>
            <artifactId>common-logging</artifactId>
            <groupId>common-logging</groupId>
         </exclusion>
      </exclusions>
   </dependency>
</dependencies>
2. 설정파일(logback.xml) 추가
메인에 있는 코드가 실행될 때 적용하고 싶은 설정파일은  src/main/resource 밑에 두고, 테스트 단계에서 별도의 설정파일을 적용하고 싶으면 src/test/resource 밑에 둔다.
1) 로그 레벨
TRACE → DEBUG → INFO → WARN → ERROR 의 로그 레벨이 있고, 설정파일에서 설정 레벨 이상의 로그를 출력할 수 있다.
예) 레벨 : INFO로 설정하면 TRACE, DEBUG 레벨의 로그는 출력되지 않는다.

2) Appender
로그를 출력할 위치, 출력 형식등을 지정할 때 사용된다.
기본적인 Appender로는 ConsolAppender, FileAppender, RollingFileAppender가 있다.
ConsolAppender : 로그를 콘솔에 출력시킨다.
FileAppender : 로그의 내용을 지정된 파일에 기록한다.
RollingFileAppender : 지정된 패턴에 따라 로그가 파일에 기록하도록 하여 대량의 로그를 효과적으로 기록할 때 사용된다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %C.%M[%L] %m%n</pattern>
      </encoder>
   </appender>
   <root level="debug">
      <appender-ref ref="STDOUT" />
   </root>
</configuration>
3. 코드 예

public class LogSample {
    private static final Logger logger = LoggerFactory.getLogger(LogSample.class);
    public static void main(String args[]){
  String stringMsg = "Test";
  int integerMsg = 123;
  logger.trace("trace");
  logger.debug("debug");
  logger.debug("debug {} {}", stringMsg, integerMsg);
  logger.info("info");
  logger.warn("warn");
  logger.error("error");
    }
}

결과