Intstant instant = Instant.ofEpochMilli(Long.parseLong(String timestamp));
Instant current = Instant.now();
instant.compareTo(current);
1 : t1 > t2
0 : t1 == t2
-1 : t1 < t2
Intstant instant = Instant.ofEpochMilli(Long.parseLong(String timestamp));
Instant current = Instant.now();
instant.compareTo(current);
1 : t1 > t2
0 : t1 == t2
-1 : t1 < t2
element.click 으로 같은 화면에서 UI가 갱신되는 게 아니라 새 탭이 열렸을 경우,
selenium driver에 알려줘야 한다.
그렇지 않으면 기존에 오픈 된 브라우져의 화면에서 element를 찾게 되어 no such element 에러 메시지를 보게 된다.
//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);
test framework을 이용하여 단위 테스트 진행 시 assert를 유연하게 하기 위해 matcher를 이용하여 좀 더 쉽고 확장성 있는 assert를 하기 위해 만들어진 framework이다.
Hamcrest는 처음부터 test framework과 통합되도록 설계되어 JUnit, TestNG와 함께 사용할 수 있다.
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>2.2</version>
<scope>test</scope>
</dependency>
assertThat(actual, is(equalTo(expedted);
assertThat(result, instanceof String);
assertThat(result, is(hasItem(anyOf(equalTo("x", equalTo("y"), equalTo("z"))))));@Test public void test(){ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); String methodName = stackTraceElements[1].getMethodName(); }
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);
userId : test password : qwe123
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();
<dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports</artifactId> <version>3.1.5</version> </dependency>
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; } }
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()); } }
<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>
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"); } }
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"); } }
<!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>
@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) |
@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 |
@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)
....
|
<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>
<?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>
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"); } }
import org.junit.Test; import junit.framework.TestCase; import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner; import net.sourceforge.groboutils.junit.v1.TestRunnable; public class TestThread extends TestCase{ private static int THREAD_SIZE = 20; /* * Test class should have exactly one public zero-argument constructor이므로 * TestCase 클래스를 extends 하고 GroboUtils의 클래스인 TestRunnable을 상속받은 클래스를 이너클래스로 사용하였다. */ public class MultiThreadTest extends TestRunnable { private int i = 0; public MultiThreadTest(int i){ this.i = i; } @Override public void runTest() throws Throwable { Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + " : [" + i + "]"); } } @Test public void test() throws Throwable{ TestRunnable[] t = new TestRunnable[THREAD_SIZE]; for(int index=0; index < THREAD_SIZE; index++){ t[index]=new MultiThreadTest(index); } MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(t); mttr.runTestRunnables(); System.out.println("main end........................."); } }
public interface Observer { public void update(int data); }
public class CalculatorModel { private int data; private ArrayList list = new ArrayList(); public void addTwoNumber(int firstNumber, int secondNumber){ data = firstNumber + secondNumber; notifyObservers(); } public void registerObserver(Observer o){ list.add(o); } public void notifyObservers() { for(Observer o : list){ o.update(data); } } }
public class CalculatorController implements ActionListener{ private CalculatorModel model; private CalculatorView view; public CalculatorController(CalculatorModel model, CalculatorView view) { this.model = model; this.view = view; this.view.setCalculatorListener(this); } @Override public void actionPerformed(ActionEvent arg0) { try { int firstNumber = view.getFirstNumber(); int secondNumber = view.getSecondNumber(); model.addTwoNumber(firstNumber, secondNumber); } catch (RuntimeException e) { e.printStackTrace(); } } }
public class CalculatorView extends JFrame implements Observer{ private JTextField firstNumber = new JTextField(10); private JLabel additionLabel = new JLabel("+"); private JTextField secondNumber = new JTextField(10); private JButton calculateButton = new JButton("계산"); private JTextField calcSolution = new JTextField(10); private JPanel calcPanel = new JPanel(); public CalculatorView() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 200); setLayout(new BorderLayout()); calcPanel.add(firstNumber); calcPanel.add(additionLabel); calcPanel.add(secondNumber); calcPanel.add(calculateButton); calcPanel.add(calcSolution); add(calcPanel, BorderLayout.CENTER); } public int getFirstNumber() { return Integer.parseInt(firstNumber.getText()); } public int getSecondNumber() { return Integer.parseInt(secondNumber.getText()); } public void setCalcSolution(int result) { calcSolution.setText(result +""); } public void setCalculatorListener(ActionListener listener){ calculateButton.addActionListener(listener); } @Override public void update(int data) { setCalcSolution(data); } }
public class MVCTest { public static void main(String[] args) { CalculatorView view = new CalculatorView(); CalculatorModel model = new CalculatorModel(); model.registerObserver(view); @SuppressWarnings("unused") CalculatorController controller = new CalculatorController(model, view); view.setVisible(true); } }