2020년 11월 16일 월요일

.gitignore 파일 규칙

.gitignore 파일이란?

사용자가 원하지 않는 파일들을 자동으로 git commit 대상에서 제외하도록 규칙을 작성


원하지 않는 파일은?

- IDE tool과 관련된 설정파일

- 언어의 빌드 결과물, 로그 패키지 관련 파일

- 사용자가 제외하기 원하는 파일 등

- gitignore 참고 url : https://github.com/github/gitignore


.gitignore 파일 위치는?

프로젝트 최상단 폴더에 위치시키면 된다.

.gitignore 파일 규칙

- #은 주석 역할

- 표준 glob 패턴 사용

- / 를 사용하면 규칙이 프로젝트 전체에 적용되지 않음

- / 로 끝나는 것은 폴더로 인식

- ! 를 사용하면 무시되지 않음


.gitignore sample

#*#
.#*
*~
_site/
*/src/META-INF/
*/src/main/java/META-INF/
bin/
target/
.classpath
.project
.DS_Store
.settings/
.springBeans
*.iml
*.iws
*.ipr
.idea/
code/
cargo-installs/
atlassian-ide-plugin.xml
deploy/
# 모든 확장자 .txt 파일을 무시
*.txt

# 무시하는 모든 확장자 .txt 파일들 중에서 test.txt 파일은 무시하지 않음
!test.txt

# Project/
# ㄴ.gitignore
# ㄴsrc/
# ㄴabc.txt
# ㄴTODO/
# ㄴtest1.txt
# ㄴTODO/
# ㄴtest2.txt
#
# 현재 폴더 중에서 TODO 폴더에 있는 모든 파일을 무시
# (즉, test1.txt 파일만 무시되고 test2.txt 파일은 무시되지 않음)
/TODO

# 프로젝트 전체 폴더 중 TODO라는 폴더명을 사용하는 TODO 폴더의 하위 파일은 모두 무시
# (즉, test1.txt 파일과 test2.txt 파일 모두 무시됨)
TODO/

# Project/
# ㄴ.gitignore
# ㄴdoc/
# ㄴa.txt
# ㄴb.pdf
# ㄴserver/
# ㄴaa.txt
# ㄴbb.pdf
#
# 현재 폴더 중에서 doc 폴더 바로 밑에 있는 .txt 확장자 파일만 모두 무시
# 단, doc/server/aa.txt 와 같은 형식에서는 .txt 확장자 파일이 무시되지 않음
doc/*.txt

# 현재 폴더 중에서 doc 폴더 하위에 있는 .pdf 확장자 파일은
# doc 폴더 하위 어떤 폴더에 들어 있더라도 모두 무시
# (즉, b.pdf 파일과 bb.pdf 파일 모두 무시됨)
doc/**/*.pdf

Git 원격 및 로컬 디렉토리 연동방법

1. git init                                        //저장소 초기화

2. git add 파일명(폴더)                   //파일 및 폴더 추가

3. git commit -m "first commit"    //commit

4. git remote add origin URL        //원격 저장소 연동

5. git push -u origin master <리모트 저장소 이름> <push할 브랜치 이름>    //파일 및 폴더 push

2020년 11월 9일 월요일

element.click으로 브라우져의 새 탭이 열렸을 때 driver 제어 방법

 element.click 으로 같은 화면에서 UI가 갱신되는 게 아니라 새 탭이 열렸을 경우,

selenium driver에 알려줘야 한다.

그렇지 않으면 기존에 오픈 된 브라우져의 화면에서 element를 찾게 되어 no such element 에러 메시지를 보게 된다.


[How to]

//driver 제어를 위한 현재 열려있는 브라우져 확인
String parentWindow = driver.getWindowHandle();

element.click();


String childWindow = null;
for(String childs: driver.getWindowHandles()){
if(!childs.equals(parentWindow)){
childWindow = childs;
break;
}
}
driver.switchTo().window(childWindow);

2020년 11월 6일 금요일

Hamcrest Test Framework

 Hamcrest란?

test framework을 이용하여 단위 테스트 진행 시 assert를 유연하게 하기 위해 matcher를 이용하여 좀 더 쉽고 확장성 있는 assert를 하기 위해 만들어진 framework이다. 

Hamcrest는 처음부터 test framework과 통합되도록 설계되어 JUnit, TestNG와 함께 사용할 수 있다.


maven dependency

<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>2.2</version>
<scope>test</scope>
</dependency>

Hamcrest code

assertThat(actual, is(equalTo(expedted);
assertThat(result, instanceof String);
assertThat(result, is(hasItem(anyOf(equalTo("x", equalTo("y"), equalTo("z"))))));

Hamcrest Matcher 

allOf - matches if all matchers match (short circuits)
anyOf - matches if any matchers match (short circuits)
not - matches if the wrapped matcher doesn’t match and vice
equalTo - test object equality using the equals method
is - decorator for equalTo to improve readability
hasToString - test Object.toString
instanceOf, isCompatibleType - test type
notNullValue, nullValue - test for null
sameInstance - test object identity
hasEntry, hasKey, hasValue - test a map contains an entry, key or value
hasItem, hasItems - test a collection contains elements
hasItemInArray - test an array contains an element
closeTo - test floating point values are close to a given value
greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo
equalToIgnoringCase - test string equality ignoring case
equalToIgnoringWhiteSpace - test string equality ignoring differences in runs of whitespace
containsString, endsWith, startsWith - test string matching

2020년 1월 22일 수요일

Python Test Code 예제


import unittest

class ArithTest(unittest.TestCase):
    def runTest(self):
        """ Test addition and succeed. """
        self.failUnless(1 + 1 == 2, one plus one fails!’)
        self.failIf(1 + 1 != 2, one plus one fails again!’)
        self.failUnlessEqual(1 + 1, 2, more trouble with one plus one!’)

def suite():
    suite = unittest.TestSuite()
    suite.addTest(ArithTest())
    return suite

if __name__ == __main__:
    runner = unittest.TextTestRunner()
    test_suite = suite()
    runner.run(test_suite)

Selenium WebDriver setting


public class LaunchWebDriver {

    private static final Logger logger = LoggerFactory.getLogger(UserPageTest.class);

    WebDriver driver;

    public LaunchWebDriver(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    public WebDriver launchWebDriverMode(String headlessOnOff) {

        Path path = Paths.get("");
        String pathStr = path.toAbsolutePath().toString(); 
        logger.debug("pathStr={}", pathStr);

  /* MAC 과 WINDOWS chromedriver 분기 */
        if (isWindows()) {
            System.setProperty("webdriver.chrome.driver", pathStr + "//driver//chromedriver.exe");
        } else if (isMac()) {
            System.setProperty("webdriver.chrome.driver", pathStr + "//driver//chromedriver");
        } else {
            logger.error("지원하지 않는 OS 입니다.");
            return null;
        }

        ChromeOptions co = new ChromeOptions();
        logger.debug("computername={}", System.getenv("computername"));
        /* 공통 ChromeOptions 값. */
        co.addArguments("start-maximized");
        co.addArguments("enable-automation");
        co.addArguments("--disable-gpu");
        if (isWindows() && "NG-BF".equals(System.getenv("computername"))) {
            /* Jenkins 서버(windows)는 항상 headless 모드이다 (java.awt.headless = true) */
            logger.debug("headless Mode : NG-BF is Always headlessMode");
            /* jenkins 에만 추가되는 ChromeOptions 값. */
            co.addArguments("--no-sandbox");

        } else {
            if ("On".equals(headlessOnOff)) { // On / Off
                /* headless chrome */
                co.addArguments("--headless");
   }
        }

        driver = new ChromeDriver(co);

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // 기본 대기 시간
        driver.manage().window().maximize();
        return driver;
    }

    public static boolean isWindows() {
        return (OS.isFamilyWindows());
    }
    public static boolean isMac() {
        return (OS.isFamilyMac());
    }
}



public abstract class BaseTest {
    public WebDriver driver;
    public LaunchWebDriver launchWebDriver;

    @BeforeClass
    public void setUp(){
        System.out.println("*** before class ****");
        String headlessOnOff ="On"; // headless = On or Off
        launchWebDriver = new LaunchWebDriver(driver);
        driver = launchWebDriver.launchWebDriverMode(headlessOnOff);
        if(driver == null){
            Assert.assertTrue(false);
        }
    }

    @AfterClass
    public void tearDown(){
        System.out.println("*** after class ****");
        if( driver != null)
            driver.quit();
    }

    @AfterTest
    public void afterTest() throws IOException {
        System.out.println("*** after test ****");
        if( LaunchWebDriver.isWindows() ){
            Runtime.getRuntime().exec("taskkill /F /IM chromedriver.exe /T");
        }
    }
}

2020년 1월 21일 화요일

SQL Join

SQL Join







2020년 1월 17일 금요일

test 메소드 이름 알아오기

@Test
public void test(){
 StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
 String methodName = stackTraceElements[1].getMethodName();
}

API Test에서 테스트 수행 시 profile 선택

1. mvn clean test -P ${env}
env = qa or release or stage

2. intelliJ 에서는






















Spec by Exam

API spec 분석 후 해당 API에 대해 예상되는 intput값과 output값을 기입하는 문서.

TC No Test Level Assertion Precondition Input Output Comment

Test Level

Positive
P-Mandatory : 필수 파라메타로 기본 기능 검증
P-ALL : 모든 파라메타로 기본 기능 검증
P-InRange : 필수 파라메타에 대한 범위 검증, 조건부 필수 파라메타에 대한 범위 내 검증, 옵션 파라메타에 대한 범위 내 검증

Negative
N-isMandatory : 파라메타 존재에 대한 예외 처리 검증
N-OutRange : 유효하지 않은 값에 대한 예외 처리 검증
N-Restriction : 파라메타 별 제약 사항 검증


TestNG의 ReportNG 설정법

pom.xml

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>${selenium.java.version}</version>
    </dependency>
    <dependency>
        <groupId>org.uncommons</groupId>
        <artifactId>reportng</artifactId>
        <version>${reportng.version}</version>
    </dependency>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>${guice.version}</version>
    </dependency>
    ......
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven.surefire.version}</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <argLine>-Dfile.encoding=UTF-8</argLine>
                <properties>
                    <!-- Setting ReportNG listeners -->
                    <property>
                        <name>usedefaultlisteners</name>
                        <value>false</value>
                    </property>
                    <property>
                        <name>listener</name>
                        <value>org.uncommons.reportng.HTMLReporter,
                            org.uncommons.reportng.JUnitXMLReporter</value>
                    </property>
                </properties>
                <suiteXmlFiles>
                    <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
        ......
    </plugins>
</build>


testng.xml(test-suite)

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="TestNG Suite Name">
    <listeners>
        <listener class-name="org.uncommons.reportng.HTMLReporter" />
        <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
    </listeners>
    <test name="tmon_monthly_maintenance">
        <classes>
            <class name="com.tmoncorp.test.maintenance.TmonHomeTest" />
            <class name="com.tmoncorp.test.maintenance.UserPageTest" />
            .....
        </classes>
    </test>
</suite>

Response Data 추출 시 NullPointerException으로 테스트가 종료되지 않게 하려면

데이터 추출 후 assertion 시 isNotNull로 하려고 했으나 데이터 추출하는 부분에서 NullPointerException이 발생하게 되면 assert를 하지 않고 바로 테스트가 종료된다.

리포트에서도 NullPointerException으로 fail이 발생했다고만 나와서 왜 NullPointerException이 났는지 코드를 봐야 하는 문제점이 있다.

해결책으로는 MapUtils(org.apache.commons.collections)를 사용하면 된다.
MapUtils의 get Method들은 내부적으로 null 체크를 한다.

<response>
{
"data": {
"dealSrl": [
1111111111
],
"total": 1
},
"httpStatus": "OK",
"httpCode": 200
}
"assertion  : data.dealSrl[0]의 dealSrl 값 확인" 이라고 했을 때 

Map<Object, Object> resMap = jsonPath.get("data");
List<Long> dealSrlList = (List) MapUtils.getObject(resMap, "dealSrl");
softAssertions.assertThat(dealSrlList.size()).as(methodName).isEqualTo(total);
 
Long dealSrl = dealSrlList.get(0);
logger.debug("dealSrl : " + dealSrl);
softAssertions.assertThat(dealSrl).as(methodName).isNotNull();

2020년 1월 16일 목요일

.gitignore 내용

#*#
.#*
*~
_site/
*/src/META-INF/
*/src/main/java/META-INF/
bin/
target/
.classpath
.project
.DS_Store
.settings/
.springBeans
*.iml
*.iws
*.ipr
.idea/
code/
cargo-installs/
atlassian-ide-plugin.xml
deploy/

Selenium implicitly wait & explicitly wait

[implicitly wait]
해당 페이지에 속한 element가 모두 로딩될 때 까지 기다리는 방식

syntax
driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);

example
driver = new ChromeDriver(co);

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
return driver;


[explicitly wait]
특정 element가 나타날 때 까지 기다려주는 방식

syntax
WebDriverWait wait = new WebDriverWait(WebDriverReference, TimeOut);

exmaple
driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, 20);
....
WebElement element;
element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(",,,")));
element.click();

ChromeOptions argument

ChromeOptions argument 설명

https://peter.sh/experiments/chromium-command-line-switches/


2020년 1월 14일 화요일

HttpStatusCode 체크

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
 
 
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(new HttpGet(URL));
int statusCode = response.getStatusLine().getStatusCode();
logger.debug("StatusCode: {}", statusCode);