SpringBoot的TestNg之编码执行+失败重跑+发送邮件

我的设计思路是这样的,直接在SpringBoot添加对应的Controller层和service层,将运行和失败重跑直接封装成接口。其实Controller层来实现调用只是一种方式一种出口,重要的是实现层的设计,才是血是肉。

设计思路

1、实现一个跑全部用例的接口
2、实现一个跑失败用例的接口
3、既然我们执行了用例,就要看到结果,那我们就通过邮件的方式来接收结果

邮件发送功能

添加JavaMail API

地址: 传送门
将其添加到pom文件中

开启QQ上的smtp服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记住这个授权码

实现发送邮件功能

这一段是我抄的大佬的功能,我只是将其放到了SpringBoot里而已

package com.newcrud.utils;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

@Component
public class SendMail {
    public void sendMail(){

        // 创建一个Property文件对象
        Properties props = new Properties();

        // 设置邮件服务器的信息,这里设置smtp主机名称
        props.put("mail.smtp.host", "smtp.qq.com");

        // 设置socket factory 的端口
        props.put("mail.smtp.socketFactory.port", "465");

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

        // 设置需要身份验证
        props.put("mail.smtp.auth", "true");

        // 设置SMTP的端口,QQ的smtp端口是25
        props.put("mail.smtp.port", "25");

        // 身份验证实现
        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {

            protected PasswordAuthentication getPasswordAuthentication() {
                // 第二个参数,就是我QQ开启smtp的授权码
                return new PasswordAuthentication("xxxxx@qq.com", "indwjcbpfwrbbebf");
            }
        });
        try {

            // 创建一个MimeMessage类的实例对象
            Message message = new MimeMessage(session);

            // 设置发件人邮箱地址
            message.setFrom(new InternetAddress("xxxx@qq.com"));

            // 设置收件人邮箱地址
            message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("xxx@xxx.com"));

            // 设置邮件主题
            message.setSubject("单元测试发送邮件");

            // 创建一个MimeBodyPart的对象,以便添加内容
            BodyPart messageBodyPart1 = new MimeBodyPart();

            // 设置邮件正文内容
            messageBodyPart1.setText("这个是邮件的正文部分");
            // 创建另外一个MimeBodyPart对象,以便添加其他内容
            MimeBodyPart messageBodyPart2 = new MimeBodyPart();

            // 设置邮件中附件文件的路径
            String filename = "test-output/emailable-report.html";

            // 创建一个datasource对象,并传递文件
            DataSource source = new FileDataSource(filename);

            // 设置handler
            messageBodyPart2.setDataHandler(new DataHandler(source));

            // 加载文件
            messageBodyPart2.setFileName(filename);

            // 创建一个MimeMultipart类的实例对象
            Multipart multipart = new MimeMultipart();

            // 添加正文1内容
            multipart.addBodyPart(messageBodyPart1);

            // 添加正文2内容
            multipart.addBodyPart(messageBodyPart2);

            // 设置内容
            message.setContent(multipart);
            // 最终发送邮件
            Transport.send(message);

            System.out.println("=====邮件已经发送=====");

        } catch (MessagingException e) {

            throw new RuntimeException(e);

        }

    }
}

再来测试一下功能是否正常,我已经执行过一次xml文件了,已经生成了对应的out-put文件夹

package com.newcrud.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@SpringBootTest
public class SendMailTest extends AbstractTestNGSpringContextTests {
    @Autowired
    SendMail sendMail;

    @Test
    public void testSendMail() {
        sendMail.sendMail();
    }
}

执行后正常收到邮件,说明功能正常。

实现执行全部和失败测试用例

接口

package com.newcrud.service;

public interface TestNgRunService {
    void runAll();
    void runFail();
}

实现类

package com.newcrud.service.impl;

import com.newcrud.service.TestNgRunService;
import org.apache.tomcat.jni.Time;
import org.springframework.stereotype.Service;
import org.testng.TestNG;

import java.util.ArrayList;
import java.util.List;

@Service
public class TestNgRunServiceImpl implements TestNgRunService {
    @Override
    public void runAll() {
        TestNG testNone=new TestNG();
        List<String> list=new ArrayList<>();
        list.add("testng.xml");
        testNone.setTestSuites(list);
        testNone.run();
    }

    @Override
    public void runFail() {
        TestNG testNTwo = new TestNG();
        List<String> list=new ArrayList<>();
        list.add("test-output/testng-failed.xml");
        testNTwo.setTestSuites(list);
        testNTwo.run();
    }
}

执行类

package com.newcrud.service.impl;

import com.newcrud.utils.SendMail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;

import static org.testng.Assert.*;

@SpringBootTest
public class TestNgRunServiceImplTest extends AbstractTestNGSpringContextTests {
    @Autowired
    TestNgRunServiceImpl testNgRunService;
    @Autowired
    SendMail sendMail;
    @Test
    public void testRunAll() {
        testNgRunService.runAll();
        sendMail.sendMail();
    }

    @Test
    public void testRunFail() {
        testNgRunService.runFail();
        sendMail.sendMail();
    }
}

测试一下

测试类A
package com.newcrud.testngTest;
import org.testng.Assert;
import org.testng.annotations.Test;

public class TestFour  {
    @Test
    public void testA()  {
        System.out.println("testA");
        Assert.assertEquals(1,2);
    }

    @Test
    public void testB(){
        System.out.println("testB");
        Assert.assertEquals(1,1);
    }
}
测试类B
package com.newcrud.testngTest;

import org.testng.Assert;
import org.testng.annotations.Test;

public class TestThree {
    @Test
    public void testA(){
        System.out.println("testA");
        Assert.assertEquals(1,2);
    }
    @Test
    public void testB(){
        System.out.println("testB");
        Assert.assertEquals(1,1);
    }
}
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
    <test verbose="2"  name="/Users/zc/IdeaProjects/NewCRUD/src/test/java/com/newcrud" time-out="3000">
        <classes>
            <class name="com.newcrud.testngTest.TestThree"></class>
            <class name="com.newcrud.testngTest.TestFour"></class>
        </classes>
    </test>
</suite>

以后在IDEA上直接直接执行这个执行类TestNgRunServiceImplTest就可以了,每次执行完都会发送对应的邮件。

看到的人一定很疑惑,为什么我要写实现类@Service,是因为我想实现的是通过接口调用,很不幸,我失败了,所以把Controller删除了,本地好好的,但是启动了SpringBoot之后调用接口就会报错找不到xml里的对应的测试类,太难了。所以就这样吧暂时,累了

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐