Я хочу отправить электронное письмо после того, как Suite будет выполнен в Selen TestNG Java? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть testSuite, в котором я запускаю класс ForgotPasswordTest.java. В конце выполнения пакета я хочу отправить электронное письмо с отчетом по электронной почте, сгенерированным с использованием метода AfterSuite. Как мне это сделать?

Вот мой номер:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="false" verbose="2">
  <listeners>
    <listener class-name="utility.ScreenshotOnFailure" />
    <listener class-name="org.uncommons.reportng.HTMLReporter" />
  </listeners> <test name="Run on Chrome">
    <parameter name="browser" value="chrome"/>
    <parameter name="grid" value="yes"></parameter>
    <parameter name="baseURL" value="https://dev.miride.com/"/>
    <classes>
      <!-- <class name="test.LoginPageTest"/> -->
      <!-- <class name="test.SignUpPageTest"/> -->
      <class name="test.ForgotPasswordTest"/>
     <!--  <class name="test.miAccountPageTest"/> -->
    </classes>
  </test>
</suite>

Мой класс ForgotPasswordTest.java выглядит следующим образом:

package test;
import org.testng.annotations.Test;
import core.OpenAndCloseBrowser;
import dataProvider.DataProviderForForgotPasswordPage;
import email.emailReport;
import pages.ForgotPasswordPage;
import pages.HomePage;
import pages.LoginPage;
import org.testng.annotations.AfterSuite;
public class ForgotPasswordTest extends OpenAndCloseBrowser{

    //TC#1 - Test case to request for new password reset link
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC1")
    public void ForgotPassword_TC1(String emailaddress) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.clickResetPasswordBtn();
    }

    //TC#2 - Test case to verify validation message in case of clearing email address field
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC2")
    public void ForgotPassword_TC2(String emailaddress, String validation) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.clear_EmailAddress(emailaddress);
    fppage.verify_ValidationMessage(validation);
    }

    //TC#3 - Test case to verify validation message in case of unregistered email address
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC3")
    public void ForgotPassword_TC3(String emailaddress, String validation) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.clickResetPasswordBtn();
    fppage.verify_ValidationMessage(validation);
    }

    //TC#4 - Test case to verify validation message in case of invalid email address
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC4")
    public void ForgotPassword_TC4(String emailaddress, String validation) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.verify_ValidationMessage(validation);
    }

    @AfterSuite
    public void sendMail(){
        emailReport.execute();
    }
}

Кроме того, мой Email Report.java выглядит следующим образом:

package email;

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.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.testng.annotations.AfterSuite;

public class emailReport {


public static void execute() {

    // Create object of Property file
    Properties props = new Properties();

    // this will set host of server- you can change based on your requirement 
    props.put("mail.smtp.host", "smtp.gmail.com");

    // set the port of socket factory 
    props.put("mail.smtp.socketFactory.port", "465");

    // set socket factory
    props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");

    // set the authentication to true
    props.put("mail.smtp.auth", "true");

    // set the port of SMTP server
    props.put("mail.smtp.port", "465");

    // This will handle the complete authentication
    Session session = Session.getDefaultInstance(props,

            new javax.mail.Authenticator() {

                protected PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication("radhikarj94@gmail.com", "xyz");

                }

            });

    try {

        // Create object of MimeMessage class
        Message message = new MimeMessage(session);

        // Set the from address
        message.setFrom(new InternetAddress("radhikarj94@gmail.com"));

        // Set the recipient address
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("radhikarj94@gmail.com"));

                    // Add the subject link
        message.setSubject("Testing Subject");

        // Create object to add multimedia type content
        BodyPart messageBodyPart1 = new MimeBodyPart();

        // Set the body of email
        messageBodyPart1.setText("This is message body");

        // Create another object to add another content
        MimeBodyPart messageBodyPart2 = new MimeBodyPart();

        // Mention the file which you want to send
        String filename = "./test-output/Suite/emailable-report.html";

        //String filename = System.getProperty("emailable-report.html") + "./test-output/Suite/emailable-report.html";//"./test-output/Suite/emailable-report.html";
     /* \\test-output\\emailable-report.html*/
        // Create data source and pass the filename
        DataSource source = new FileDataSource(filename);

        // set the handler
        messageBodyPart2.setDataHandler(new DataHandler(source));

        // set the file
        messageBodyPart2.setFileName(filename);

        // Create object of MimeMultipart class
        Multipart multipart = new MimeMultipart();

        // add body part 1
        multipart.addBodyPart(messageBodyPart2);

        // add body part 2
        multipart.addBodyPart(messageBodyPart1);

        // set the content
        message.setContent(multipart);

        // finally send the email
        Transport.send(message);

        System.out.println("=====Email Sent=====");

    } catch (MessagingException e) {
        System.out.println("=====Email failed=====");
        throw new RuntimeException(e);

    }

}

}

Извините за длинный код. В конце консоли отображается:

Suite
Total tests run: 4, Failures: 0, Skips: 0
Configuration Failures: 1, Skips: 0

Есть ли что-нибудь, что я могу сделать, чтобы исправить свой код?

1 Ответ

0 голосов
/ 01 сентября 2018

Встроенный отчет TestNG, а именно, emailable-report.html генерируется прослушивателем отчетов в TestNG.

По умолчанию TestNG выполняет фазу отчетности (т. Е. Вызывает метод org.testng.IReporter#generateReport реализации интерфейса org.testng.IReporter, только после того, как все наборы завершены.

Метод, помеченный @AfterSuite, выполняется до того, как набор завершается, что означает, что он выполняется еще до того, как emailable-report.html будет сгенерирован.

Возможно, именно поэтому вы видите сбой конфигурации, т. Е. Сбой в вашем аннотированном методе @AfterSuite.

Чтобы решить вашу проблему, вы должны создать новый репортер, который реализует интерфейс org.testng.IExecutionListener и в его org.testng.IExecutionListener#onExecutionFinish делает вызов emailReport.execute();

Это должно помочь вам сделать то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...