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)
2020년 1월 22일 수요일
Python Test Code 예제
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월 17일 금요일
test 메소드 이름 알아오기
@Test public void test(){ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); String methodName = stackTraceElements[1].getMethodName(); }
Spec by Exam
API spec 분석 후 해당 API에 대해 예상되는 intput값과 output값을 기입하는 문서.
Test Level
Positive
P-Mandatory : 필수 파라메타로 기본 기능 검증
P-ALL : 모든 파라메타로 기본 기능 검증
P-InRange : 필수 파라메타에 대한 범위 검증, 조건부 필수 파라메타에 대한 범위 내 검증, 옵션 파라메타에 대한 범위 내 검증
Negative
N-isMandatory : 파라메타 존재에 대한 예외 처리 검증
N-OutRange : 유효하지 않은 값에 대한 예외 처리 검증
N-Restriction : 파라메타 별 제약 사항 검증
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
testng.xml(test-suite)
<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 체크를 한다.
리포트에서도 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
example
[explicitly wait]
특정 element가 나타날 때 까지 기다려주는 방식
syntax
exmaple
해당 페이지에 속한 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();
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);
피드 구독하기:
글 (Atom)