使用 SoapUI 使用 JavaCode 在 Groovy-Script 中调用属性
Call properties in Groovy-Script with JavaCode using SoapUI
我已经开始使用 SoapUI 5(非专业版)构建服务监视器。服务监视器应该能够:
- 测试步骤 1(http 请求):调用一个 URL,生成一个令牌
- Teststep2(groovy 脚本):解析响应并将令牌保存为 属性
- Teststep3(http请求):调用另一个URL
- Teststep4(groovy脚本):解析repsonseHttpHeader,将statusHeader保存在testCase中-属性并检查它是否为'200'、'400'、'403'...
- Teststep5(groovy 脚本):当它不是“200”时写一封电子邮件
第 1 步到第 4 步没有任何问题,并且通过执行我的脚本发送电子邮件(第 5 步)也正常,但我想根据 statusHeader 更改电子邮件内容。例如:
404
: The requested resource could not be found
403
: It is forbidden. Please check the token generator
- ...
解析并保存httpHeaderStatusCode的代码:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
// get responseHeaders of ServiceTestRequest
def httpResponseHeaders = context.testCase.testSteps["FeatureServiceTestRequest"].testRequest.response.responseHeaders
// get httpResonseHeader and status-value
def httpStatus = httpResponseHeaders["#status#"]
// extract value
def httpStatusCode = (httpStatus =~ "[1-5]\d\d")[0]
// log httpStatusCode
log.info("HTTP status code: " + httpStatusCode)
// Save logged token-key to next test step or gloabally to testcase
testRunner.testCase.setPropertyValue("httpStatusCode", httpStatusCode)
发送邮件代码:
// From http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendMailTLS {
public static void main(String[] args) {
final String username = "yourUsername@gmail.com";
final String password = "yourPassword";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("yourSendFromAddress@domain.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("yourRecipientsAddress@domain.com"));
message.setSubject("Status alert");
message.setText("Hey there,"
+ "\n\n There is something wrong with the service. The httpStatus from the last call was: ");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
我想做什么:我想在我最后一个 groovy 脚本中访问我第一个 groovy 脚本(最后一行)中保存的测试用例 httpStatusCode
属性我在哪里发送我的电子邮件。有什么东西可以处理这个吗?
我搜索了两个小时,但没有找到有用的东西。一个可能的解决方法是我必须使用 if 语句和 testRunner.runTestStepByName
方法调用不同消息的不同电子邮件脚本,但更改电子邮件的内容会更好。
提前致谢!
您可以执行以下操作:
- 在您的 java class 中添加一个包含所有预期内容的地图
您想要的响应代码和响应消息
电子邮件的主题或内容。
- 我建议您将它放在 main 以外的方法中,这样
你从 soapui 的 groovy 初始化 class 对象和调用方法
脚本,当然你也用main做。
- 方法应将响应代码作为参数。
- 将其作为key从地图中获取相关值并放入
电子邮件。
- 为您的 class 创建一个 jar 文件并将 jar 文件放在
$SOAPUI_HOME/bin/ext 目录
- 在您的 soapui 测试用例中,测试步骤 5 (groovy) 调用您的方法
从 class 你写的就像你在 java 中的调用一样。例如:如何
从下面给出的 soapui groovy 调用你的 java
//use package, and imports also if associated
SendMailTLS mail = new SendMailTLS()
//assuming that you move the code from main method to sendEmail method
mail.sendEmail(context.expand('${#TestCase#httpStatusCode}')
您必须更改最后一个 groovy 脚本中的 class 定义,而不是 main
定义一个方法来发送以 statusCode
作为参数的电子邮件你的 sendMailTLS
class。然后在定义 class 的同一 groovy 脚本中使用 def statusCode = context.expand('${#TestCase#httpStatusCode}');
获取 属性 值,然后创建 class 的实例并调用您的方法将 属性 statusCode
传递给:
// create new instance of your class
def mailSender = new SendMailTLS();
// send the mail passing the status code
mailSender.sendMail(statusCode);
您的 groovy 脚本中的所有内容必须如下所示:
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
// define the class
class SendMailTLS {
// define a method which recive your status code
// instead of define main method
public void sendMail(String statusCode) {
final String username = "yourUsername@gmail.com";
final String password = "yourPassword";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("yourSendFromAddress@domain.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("yourRecipientsAddress@domain.com"));
message.setSubject("Status alert");
// THERE YOU CAN USE STATUSCODE FOR EXAMPLE...
if(statusCode.equals("403")){
message.setText("Hey there,"
+ "\n\n You recive an 403...");
}else{
message.setText("Hey there,"
+ "\n\n There is something wrong with the service. The httpStatus from the last call was: ");
}
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
// get status code
def statusCode = context.expand('${#TestCase#httpStatusCode}');
// create new instance of your class
def mailSender = new SendMailTLS();
// send the mail passing the status code
mailSender.sendMail(statusCode);
我测试了这段代码,它工作正常 :)
。
希望这对您有所帮助,
我已经开始使用 SoapUI 5(非专业版)构建服务监视器。服务监视器应该能够:
- 测试步骤 1(http 请求):调用一个 URL,生成一个令牌
- Teststep2(groovy 脚本):解析响应并将令牌保存为 属性
- Teststep3(http请求):调用另一个URL
- Teststep4(groovy脚本):解析repsonseHttpHeader,将statusHeader保存在testCase中-属性并检查它是否为'200'、'400'、'403'...
- Teststep5(groovy 脚本):当它不是“200”时写一封电子邮件
第 1 步到第 4 步没有任何问题,并且通过执行我的脚本发送电子邮件(第 5 步)也正常,但我想根据 statusHeader 更改电子邮件内容。例如:
404
:The requested resource could not be found
403
:It is forbidden. Please check the token generator
- ...
解析并保存httpHeaderStatusCode的代码:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
// get responseHeaders of ServiceTestRequest
def httpResponseHeaders = context.testCase.testSteps["FeatureServiceTestRequest"].testRequest.response.responseHeaders
// get httpResonseHeader and status-value
def httpStatus = httpResponseHeaders["#status#"]
// extract value
def httpStatusCode = (httpStatus =~ "[1-5]\d\d")[0]
// log httpStatusCode
log.info("HTTP status code: " + httpStatusCode)
// Save logged token-key to next test step or gloabally to testcase
testRunner.testCase.setPropertyValue("httpStatusCode", httpStatusCode)
发送邮件代码:
// From http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendMailTLS {
public static void main(String[] args) {
final String username = "yourUsername@gmail.com";
final String password = "yourPassword";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("yourSendFromAddress@domain.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("yourRecipientsAddress@domain.com"));
message.setSubject("Status alert");
message.setText("Hey there,"
+ "\n\n There is something wrong with the service. The httpStatus from the last call was: ");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
我想做什么:我想在我最后一个 groovy 脚本中访问我第一个 groovy 脚本(最后一行)中保存的测试用例 httpStatusCode
属性我在哪里发送我的电子邮件。有什么东西可以处理这个吗?
我搜索了两个小时,但没有找到有用的东西。一个可能的解决方法是我必须使用 if 语句和 testRunner.runTestStepByName
方法调用不同消息的不同电子邮件脚本,但更改电子邮件的内容会更好。
提前致谢!
您可以执行以下操作:
- 在您的 java class 中添加一个包含所有预期内容的地图 您想要的响应代码和响应消息 电子邮件的主题或内容。
- 我建议您将它放在 main 以外的方法中,这样 你从 soapui 的 groovy 初始化 class 对象和调用方法 脚本,当然你也用main做。
- 方法应将响应代码作为参数。
- 将其作为key从地图中获取相关值并放入 电子邮件。
- 为您的 class 创建一个 jar 文件并将 jar 文件放在 $SOAPUI_HOME/bin/ext 目录
- 在您的 soapui 测试用例中,测试步骤 5 (groovy) 调用您的方法 从 class 你写的就像你在 java 中的调用一样。例如:如何 从下面给出的 soapui groovy 调用你的 java
//use package, and imports also if associated
SendMailTLS mail = new SendMailTLS()
//assuming that you move the code from main method to sendEmail method
mail.sendEmail(context.expand('${#TestCase#httpStatusCode}')
您必须更改最后一个 groovy 脚本中的 class 定义,而不是 main
定义一个方法来发送以 statusCode
作为参数的电子邮件你的 sendMailTLS
class。然后在定义 class 的同一 groovy 脚本中使用 def statusCode = context.expand('${#TestCase#httpStatusCode}');
获取 属性 值,然后创建 class 的实例并调用您的方法将 属性 statusCode
传递给:
// create new instance of your class
def mailSender = new SendMailTLS();
// send the mail passing the status code
mailSender.sendMail(statusCode);
您的 groovy 脚本中的所有内容必须如下所示:
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
// define the class
class SendMailTLS {
// define a method which recive your status code
// instead of define main method
public void sendMail(String statusCode) {
final String username = "yourUsername@gmail.com";
final String password = "yourPassword";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("yourSendFromAddress@domain.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("yourRecipientsAddress@domain.com"));
message.setSubject("Status alert");
// THERE YOU CAN USE STATUSCODE FOR EXAMPLE...
if(statusCode.equals("403")){
message.setText("Hey there,"
+ "\n\n You recive an 403...");
}else{
message.setText("Hey there,"
+ "\n\n There is something wrong with the service. The httpStatus from the last call was: ");
}
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
// get status code
def statusCode = context.expand('${#TestCase#httpStatusCode}');
// create new instance of your class
def mailSender = new SendMailTLS();
// send the mail passing the status code
mailSender.sendMail(statusCode);
我测试了这段代码,它工作正常 :)
。
希望这对您有所帮助,