SpringBoot的TestNg之编码执行+失败重跑+发送邮件
SpringBoot的TestNg之编码执行+失败重跑我的设计思路是这样的,直接在SpringBoot添加对应的Controller层和service层,将运行和失败重跑直接封装成接口。其实Controller层来实现调用只是一种方式一种出口,重要的是实现层的设计,才是血是肉。设计思路1、实现一个跑全部用例的接口2、实现一个跑失败用例的接口3、既然我们执行了用例,就要看到结果,那我们就通过邮件的方
·
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里的对应的测试类,太难了。所以就这样吧暂时,累了
更多推荐
已为社区贡献3条内容
所有评论(0)