왜 우리는보고가 필요한가?
Selenium이나 다른 자동화 툴을 사용할 때, 우리는 웹 애플리케이션에서 연산을 수행하고 있습니다. 그러나 자동화의 목적은 테스트중인 어플리케이션을 사용하는 것만은 아닙니다. 자동화 테스터는 응용 프로그램을 테스트하고 버그를 찾아 개발 팀 또는 상위 관리자에게보고해야합니다. 여기서보고는 소프트웨어 테스트 프로세스의 중요성을 갖습니다.
TestNG보고
TestNG 라이브러리는 매우 편리한보고 기능을 제공합니다. 실행 후 Testng 은 프로젝트 루트에 테스트 출력 폴더를 생성합니다. 이 폴더에는 두 가지 유형의 보고서 -
Index.html : 오류, 그룹, 시간, 리포터 로그, testng XML 파일 같은 정보를 포함하는 현재 실행의 전체 보고서입니다.
emailable-report.html : 테스트 케이스 메시지가 녹색 (통과 테스트 케이스의 경우) 및 빨간색 (실패한 테스트 케이스의 경우) 하이라이트로 표시된 현재 테스트 실행의 요약 보고서입니다 .
TestNG 보고서를 사용자 정의하는 방법
TestNG보고는 매우 편리하지만 여전히 보고서에 데이터가 적거나 pdf, Excel 등과 같은 다른 형식으로 보고서를 표시하거나 보고서의 레이아웃을 변경하려는 경우가 있습니다.
TestNG 보고서를 사용자 정의 할 수있는 두 가지 방법이 있습니다.
- ITestListener 인터페이스 사용 :
- IReporter 인터페이스 사용 :
ITestListener 인터페이스
실시간 보고서를 사용자 정의해야 할 때이 인터페이스를 사용합니다. 다시 말해, TetNG 제품군에서 테스트 케이스를 실행하고 각 테스트 케이스에 대한 보고서를 얻고 싶다면 각 테스트 케이스 후에 ITestListener 인터페이스를 구현해야한다. 이 인터페이스는 onTestFailure, onTestStart를 재정의합니다.
, onTestSkipped 메소드는 현재 테스트 케이스의 올바른 상태를 보냅니다.
우리가 따라갈 단계는 다음과 같습니다.
- RealGuru99Report라고하는 클래스를 작성해, 거기에 iTestListener를 구현합니다.
- iTestListener의 메소드 구현하기
- 테스트 메소드를 생성하고 RealGuru99Report 클래스를 Test Method 클래스의 리스너로 추가합니다.
코드 예제
RealGuru99TimeReport.java는 실시간보고 클래스입니다. 보고 용 ITestListener 인터페이스를 구현합니다.
package testNGReport.realTimeReport;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class RealGuru99TimeReport implements ITestListener{
@Override
public void onStart(ITestContext arg0) {
System.out.println("Start Of Execution(TEST)->"+arg0.getName());
}
@Override
public void onTestStart(ITestResult arg0) {
System.out.println("Test Started->"+arg0.getName());
}
@Override
public void onTestSuccess(ITestResult arg0) {
System.out.println("Test Pass->"+arg0.getName());
}
@Override
public void onTestFailure(ITestResult arg0) {
System.out.println("Test Failed->"+arg0.getName());
}
@Override
public void onTestSkipped(ITestResult arg0) {
System.out.println("Test Skipped->"+arg0.getName());
}
@Override
public void onFinish(ITestContext arg0) {
System.out.println("END Of Execution(TEST)->"+arg0.getName());
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO 자동 생성 메소드 스텁
}
}
TestGuru99RealReport.java는 실제 보고서의 테스트 케이스입니다.
package testNGReport.realTimeReport;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(RealGuru99TimeReport.class)
public class TestGuru99RealReport {
@Test
public void testRealReportOne(){
Assert.assertTrue(true);
}
@Test
public void testRealReportTwo(){
Assert.assertTrue(false);
}
// 테스트 케이스는 실패한 testcase = testRealReportTwo에 의존
@Test(dependsOnMethods="testRealReportTwo")
public void testRealReportThree(){
}
}
출력은 다음과 같이 보입니다.
IReporter 인터페이스
TestNG에서 생성 된 최종 테스트 보고서를 사용자 정의하려면 IReporter 인터페이스를 구현해야합니다. 이 인터페이스에는 generateReport를 구현하는 메서드가 하나뿐입니다. 이 방법은 List <ISuite>에서 전체 테스트 실행에 대한 모든 정보를 가지고 있으며이를 사용하여 보고서를 생성 할 수 있습니다.
코드 예제
Guru99Reporter.java는 보고서를 사용자 정의하는 데 사용되는 파일입니다.
package testNGReport.iReporterReport;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.testng.IReporter;
import org.testng.IResultMap;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.xml.XmlSuite;
public class Guru99Reporter implements IReporter{
@Override
public void generateReport(List<XmlSuite> arg0, List<ISuite> arg1,
String outputDirectory) {
//이 메소드의 두 번째 매개 변수 ISuite는 실행 된 모든 suite를 포함합니다.
for (ISuite iSuite : arg1) {
// 한 번에 하나의 스위트 결과의 맵을 얻습니다.
Map<String,ISuiteResult> results = iSuite.getResults();
// 결과 맵의 키 가져 오기
Set<String> keys = results.keySet();
//Go to each map value one by one
for (String key : keys) {
//현재 결과의 컨텍스트 객체
ITestContext context = results.get(key).getTestContext();
//Print Suite detail in Console
System.out.println("Suite Name->"+context.getName()
+ "::Report output Ditectory->"+context.getOutputDirectory()
+"::Suite Name->"+ context.getSuite().getName()
+"::Start Date Time for execution->"+context.getStartDate()
+"::End Date Time for execution->"+context.getEndDate());
//실패한 테스트 케이스에 대해서만 맵 가져 오기
IResultMap resultMap = context.getFailedTests();
// 실패한 테스트 케이스의 메소드 상세 정보 얻기
Collection<ITestNGMethod> failedMethods = resultMap.getAllMethods();
// 실패한 모든 메소드에서 루프를 하나씩 반복합니다.
System.out.println("--------FAILED TEST CASE---------");
for (ITestNGMethod iTestNGMethod : failedMethods) {
// 실패한 테스트 케이스를 인쇄하십시오.
System.out.println("TESTCASE NAME->"+iTestNGMethod.getMethodName()
+"\nDescription->"+iTestNGMethod.getDescription()
+"\nPriority->"+iTestNGMethod.getPriority()
+"\n:Date->"+new Date(iTestNGMethod.getDate()));
}
}
}
}
}
TestGuru99ForReporter.java는 맞춤 보고서의 데모입니다.
package testNGReport.iReporterReport;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
// 리스너를 추가하여 testcas가 완료 될 때 작성합니다.
@Listeners(value=Guru99Reporter.class)
public class TestGuru99ForReporter {
@Test(priority=0,description="testReporterOne")
public void testReporterOne(){
// 테스트 케이스 성공
Assert.assertTrue(true);
}
@Test(priority=1,description="testReporterTwo")
public void testReporterTwo(){
// 테스트 케이스 실패
Assert.assertTrue(false);
}
}
출력은
보고서의 PDF 및 전자 메일
위의 보고서 구현은 보고서 사용자 정의를 시작하는 데있어 매우 간단하고 명확합니다.
그러나 기업 환경에서는 고도로 사용자 정의 된 보고서를 작성해야합니다. 다음은 우리가 처리 할 시나리오입니다.
- PDF 형식의 사용자 정의 보고서 작성
- 화면 캡처에만 오류가 있습니다. PDF의 스크린 샷에 링크하기
- PDF의 전자 메일 보내기
PDF 보고서는 다음과 같습니다.
PDF 보고서를 작성하려면 Java API IText 가 필요합니다 . 여기에서 다운로드 하십시오 . 실제로이 IText jar를 구현하고 우리를 위해 pdf 보고서를 만드는 다른 사용자 정의 리스너 클래스가 있습니다. 여기에서 다운로드 하십시오.
위 그림은 생성 된 PDF 보고서의 기본 형식을 보여줍니다. 당신은 그것을 사용자 정의 할 수 있습니다.
여기에 우리가 어떻게 접근 할 것인가?
1 단계) 기본 클래스 만들기
2 단계) JypersionListerner.Java 사용자 정의 (PDF 작성 코드)
3 단계) 테스트 케이스를 실행하고 PDF를 작성하는 TestGuru99PDFEmail.java를 작성하십시오.
4 단계) TestGuru99PDFEmail.java에 코드를 추가하여 이메일을 통해 PDF 보고서를 보냅니다.
이 단계를 살펴 보겠습니다.
1 단계) 기본 클래스 만들기
이 기본 클래스에는 WebDriver 및 Take Screenshot을 만드는 함수가 있습니다.
package PDFEmail;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class BaseClass {
static WebDriver driver;
public static WebDriver getDriver(){
if(driver==null){
WebDriver driver ;
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
driver = new FirefoxDriver();
}
return driver;
}
/**
* 이 함수는 스크린 샷을 캡처합니다.
* @param webdriver
* @param fileWithPath
* @throws Exception
*/
public static void takeSnapShot(WebDriver webdriver,String fileWithPath) throws Exception{
// 웹 드라이버 객체를 TakeScreenshot으로 변환
TakesScreenshot scrShot =((TakesScreenshot)webdriver);
// getScreenshotAs 메서드를 호출하여 이미지 파일을 만듭니다.
File SrcFile=scrShot.getScreenshotAs(OutputType.FILE);
// 이미지 파일을 새로운 대상으로 이동
File DestFile=new File(fileWithPath);
// 대상에 파일 복사
FileUtils.copyFile(SrcFile, DestFile);
}
}
2 단계) JypersionListener.java 사용자 정의
우리는 기본 보고서 형식을 고수 할 것입니다. 하지만 2 가지 맞춤 설정을 할 것입니다.
- JypersionListener가 오류 발생시 스크린 샷을 취하도록 지시하는 코드 추가
- 스크린 샷의 링크를 첨부하면 PDF 보고서를 가져옵니다.
스크린 샷을 PDF 보고서에 첨부하는 코드 추가
3 단계) 테스트 케이스를 실행하고 PDF를 작성하는 TestGuru99PDFEmail.java를 작성하십시오.
- JyperionListener.class를 리스너로 추가합니다.
- 3 가지 테스트 케이스를 실행합니다.
- Assert.assertTrue를 사용하면 단 하나만 통과하는 동안 2 개의 테스트 케이스가 실패합니다.
- 사용자 정의에 따라 실패한 테스트 케이스에 대해서만 스크린 샷이 찍 힙니다.
package PDFEmail;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import reporter.JyperionListener;
// PDF 보고서 생성을위한 리스너 추가
@Listeners(JyperionListener.class)
public class TestGuru99PDFReport extends BaseClass {
WebDriver driver;
// 테스트 케이스가 실패하여 스크린 샷이 생성됩니다.
@Test
public void testPDFReportOne(){
driver = BaseClass.getDriver();
driver.get("http://google.com");
Assert.assertTrue(false);
}
// 테스트 케이스가 실패하여 스크린 샷이 생성됩니다.
@Test
public void testPDFReporTwo(){
driver = BaseClass.getDriver();
driver.get("http:/guru99.com");
Assert.assertTrue(false);
}
// 테스트 테스트 케이스가 패스 될 것이므로 스크린 샷이 없습니다.
@Test
public void testPDFReportThree(){
driver = BaseClass.getDriver();
driver.get("http://demo.guru99.com");
Assert.assertTrue(true);
}
4 단계) TestGuru99PDFEmail.java에 코드를 추가하여 이메일을 통해 PDF 보고서를 보냅니다.
- @AfterSuite 주석을 사용하여 PDF 보고서의 전자 메일을 보냅니다.
- Gmail을 사용하여 이메일을 보냅니다.
- 전자 메일을 사용하려면 mail.jar, pop3.jar, smptp.jar 등과 같은 많은 라이브러리 파일을 가져와야합니다.
- 이것을 실행하기 전에 시작, 끝 전자 메일 주소 및 암호를 입력하십시오
//완료 후 pdf 보고서를 전자 메일로 보냅니다.
@AfterSuite
public void tearDown(){
sendPDFReportByGMail("FROM@gmail.com", "password", "TO@gmail.com", "PDF Report", "");
}
/**
* Send email using java
* @param from
* @param pass
* @param to
* @param subject
* @param body
*/
private static void sendPDFReportByGMail(String from, String pass, String to, String subject, String body) {
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
try {
//주소에서 설정
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
//Set subject
message.setSubject(subject);
message.setText(body);
BodyPart objMessageBodyPart = new MimeBodyPart();
objMessageBodyPart.setText("Please Find The Attached Report File!");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(objMessageBodyPart);
objMessageBodyPart = new MimeBodyPart();
//Set path to the pdf report file
String filename = System.getProperty("user.dir")+"\\Default test.pdf";
//메일에 파일을 첨부 할 데이터 소스를 만듭니다.
DataSource source = new FileDataSource(filename);
objMessageBodyPart.setDataHandler(new DataHandler(source));
objMessageBodyPart.setFileName(filename);
multipart.addBodyPart(objMessageBodyPart);
message.setContent(multipart);
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
catch (AddressException ae) {
ae.printStackTrace();
}
catch (MessagingException me) {
me.printStackTrace();
}
}
}
전체 프로젝트를 여기에서 다운로드하십시오.
참고 : pdf의 스크린 샷 링크를 클릭하면 보안 대화 상자가 표시됩니다. 이 대화 상자에서 pdf를 열 수 있도록 허용해야합니다.
이렇게 생성 된 이메일은 다음과 같습니다.
개요:
- TestNG에는 내장 된보고 기능이 있습니다.
- 테스트 케이스가 완료되면 TestNG는 프로젝트 루트에 테스트 출력 폴더를 생성합니다.
- test-output 폴더에는 index.html과 emailable-report.html이라는 두 개의 주요 보고서가 있습니다.
- TestNG 보고서를 사용자 정의하려면 ITestListener와 IReporter의 두 인터페이스를 구현해야합니다.
- 실행 사이에 보고서를 가져와야하는 경우 ITestListener가 필요합니다.
- 실행이 끝난 후 최종 보고서를 작성하려면 IReporter를 구현해야합니다.
- Selenium WebDriver에서 스크린 샷을 찍으면 TakesScreenShot 인터페이스에 WebDriver를 입력해야합니다.
- pdf 보고서를 생성하려면 프로젝트에 IText jar를 추가해야합니다.
'자동화테스트 > Selenium' 카테고리의 다른 글
Selenium에서의 병렬 실행 및 세션 처리 (0) | 2018.12.14 |
---|---|
Selenium WebDriver에서 스크린 샷을 만드는 방법 (0) | 2018.12.13 |
Selenium WebDriver를 사용한 크로스 브라우저 테스트 (0) | 2018.12.11 |
Selenium Webdriver에서 iFrame 처리하기 (0) | 2018.12.10 |
Selenium Framework : 키워드 기반 및 하이브리드 (0) | 2018.12.09 |