- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试运行以下CucumberWithSerenity TestRunner类:
import net.serenitybdd.cucumber.CucumberWithSerenity;
import cucumber.api.CucumberOptions;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.notification.Failure;
//@RunWith(Cucumber.class)
@RunWith(CucumberWithSerenity.class)
@CucumberOptions(format = {"pretty"}, monochrome=true)
public class TestRunner {
public static void main(String[] args) throws Exception {
System.out.println("TestRunner...");
JUnitCore junit = new org.junit.runner.JUnitCore() ;
try {
throw new Exception();
} catch(Exception e) {
// code to handle the exception
Result result = junit.run(TestRunner.class);
for (Failure failure : result.getFailures())
{
System.out.println(failure.toString());
}
}
}
}
initializationError(serenity.TestRunner): net/thucydides/core/guice/Injectors
import groovy.io.FileType
import groovy.text.Template
apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'TestRunner'
//jar {
// manifest {
// attributes 'Main-Class': 'cucumber.api.cli.Main'
// }
//}
def cucumberVersion = "1.2.4"
buildscript {
repositories { maven{ url "http://${nexus}/nexus/content/groups/public/"
} }
dependencies { classpath("net.serenity-bdd:serenity-gradle-plugin:1.0.56") }
}
repositories {
maven { url "http://${nexus}/nexus/content/groups/public/"
}
flatDir {
dirs 'test/resources/libs'
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'net.serenity-bdd.aggregator'
configurations {
//outdated dependency, use hamcrest-core:1.3
testCompile.exclude group: 'org.hamcrest', module: 'hamcrest-all'
cucumberRuntime {
extendsFrom testRuntime
}
//cucumber
}
//build.dependsOn cucumber
dependencies {
testCompile 'org.hamcrest:hamcrest-core:1.3'
testCompile 'com.jayway.restassured:rest-assured:2.7.0'
testCompile 'net.serenity-bdd:serenity-rest-assured:1.1.21'
testCompile 'net.serenity-bdd:serenity-junit:1.1.21'
testCompile 'net.serenity-bdd:serenity-core:1.1.21'
testCompile 'net.serenity-bdd:serenity-cucumber:1.1.1'
testCompile 'org.jbehave:jbehave-core:4.0.4'
testCompile 'net.serenity-bdd:serenity-jbehave:1.1.0'
testCompile 'de.codecentric:jbehave-junit-runner:1.1.0'
testCompile 'junit:junit:4.2'
testCompile 'cglib:cglib-nodep:3.2.0'
testCompile 'org.assertj:assertj-core:3.1.0'
testCompile 'org.slf4j:slf4j-simple:1.7.12'
compile 'com.jayway.jsonpath:json-path:2.0.0'
compile 'com.github.groovy-wslite:groovy-wslite:1.1.0'
compile 'org.springframework:spring-web:3.2.8.RELEASE'
testCompile 'org.apache.activemq:activemq-all:5.12.0'
testCompile 'org.mongodb:mongo-java-driver:2.11.4'
testCompile 'com.fasterxml.jackson.core:jackson-core:2.4.4'
testCompile 'com.fasterxml.jackson.core:jackson-databind:2.4.4'
testCompile "info.cukes:cucumber-junit:$cucumberVersion"
testCompile "info.cukes:cucumber-groovy:$cucumberVersion"
testCompile 'net.serenity-bdd:serenity-cucumber:1.0.17'
compile files('src/test/libs/junit-4.2.jar')
runtime files('src/test/libs/junit-4.2.jar')
compile files('src/test/libs/hamcrest-core-1.3.jar')
runtime files('src/test/libs/hamcrest-core-1.3.jar')
compile files('src/test/libs/cucumber-junit-1.2.4.jar')
runtime files('src/test/libs/cucumber-junit-1.2.4.jar')
compile files('src/test/libs/cucumber-java-1.2.4.jar')
runtime files('src/test/libs/cucumber-java-1.2.4.jar')
compile files('src/test/libs/cucumber-core-1.2.4.jar')
runtime files('src/test/libs/cucumber-core-1.2.4.jar')
//compile files('src/test/libs/serenity-cucumber-1.0.2.jar')
//runtime files('src/test/libs/serenity-cucumber-1.0.2.jar')
compile files('src/test/libs/cucumber-jvm-deps-1.0.5.jar')
runtime files('src/test/libs/cucumber-jvm-deps-1.0.5.jar')
compile files('src/test/libs/gherkin-2.12.2.jar')
runtime files('src/test/libs/gherkin-2.12.2.jar')
compile files('src/test/libs/cucumber-reporting-2.0.0.jar')
runtime files('src/test/libs/cucumber-reporting-2.0.0.jar')
compile files('src/test/libs/thucydides-core-0.9.125.jar')
runtime files('src/test/libs/thucydides-core-0.9.125.jar')
}
task cucumber() {
dependsOn assemble
doLast {
javaexec {
main = "cucumber.api.cli.Main"
classpath = configurations.cucumberRuntime
args = ['--plugin', 'pretty', '--glue', 'src/test/java', 'src/test/resources', 'src/main/java']
//classpath = configurations.cucumber
}
}
}
test{
def fileMap = new TreeMap<String, File>();
def redirectionMap = new TreeMap<String, String>();
def blacklist = new ArrayList<String>();
blacklist.add("net.thucydides.core.reflection.StackTraceAnalyser");
onOutput { descriptor, event ->
def messageBlacklisted = false;
for(String blacklistedString : blacklist) {
if(event.message.contains(blacklistedString)){
messageBlacklisted=true;
}
}
//Gradle Test Executor 1
def executor = descriptor;
while(executor.getClassName() != null)
{
executor = executor.getParent();
}
def originalKey = executor.getName();
def key = originalKey;
def redirectionMessages = [/TEST STARTED: (.*)$/];
for(def regex : redirectionMessages)
{
def result = (event.message =~ regex);
if(result.size()>=1)
{
def redirectedLocation = result[0][1];
redirectionMap.put(key, redirectedLocation);
logger.lifecycle("Redirecting "+key+"->"+redirectedLocation);
}
}
def depth = 0;
while(redirectionMap.containsKey(key) && depth < 10)
{
depth+1;
key = redirectionMap.get(key);
}
//key is still gradle test executor, may as well use something more useful
if(key.equals(originalKey))
{
key = descriptor.getClassName();
}
def streamName = key.replaceAll("[^a-zA-Z0-9\\._]+", "_");
if(!messageBlacklisted) {
if(!fileMap.containsKey(streamName)) {
def outputFile = createSerenityLogFile(streamName+".txt");
fileMap.put(streamName, outputFile);
}
def resultingMessage = preprocessOutput(event.message)
fileMap.get(streamName) << resultingMessage;
}
}
}
public String preprocessOutput(String originalMessage)
{
java.text.DateFormat dateFormat = new java.text.SimpleDateFormat("HH:mm:ss");
String timestamp = dateFormat.format(new java.util.Date());
String[] splitSegments = originalMessage.split("[\r\n]+");
Collection<String> transformedSegments = splitSegments.collect{line->
timestamp+"\t"+line+"\n";
};
String resultingMessage = transformedSegments.iterator().join("");
return resultingMessage;
}
public File createSerenityLogFile(String fileName){
def logFolder = new File(new File(project.rootDir, project.serenity.outputDirectory), "logs");
createDirectory(logFolder);
def outputFile = new File(logFolder, fileName);
deleteFile(outputFile);
createFile(outputFile);
return outputFile;
}
tasks.test.doFirst {
logging.captureStandardOutput LogLevel.INFO
logger.lifecycle("Transfering gradle properties to system properties...");
systemProperty 'cucumber.options', System.getProperty('cucumber.options', '')
if(project.hasProperty("firefox.profile.path"))
systemProperty 'firefox.profile.path', project.getProperty('firefox.profile.path')
setSystemProperty "webdriver.base.url", "http://${ftWebHost}:8080"
if(project.hasProperty("ftWebHost")){
systemProperty "restassured.base.url", project.getProperty("ftWebHost")
}
//This will set the webdriver url and the restAssured url
systemProperty "restassured.base.url", "${ftWebHost}"
setSystemProperty "webdriver.base.url", "http://${ftWebHost}:8080"
setSystemProperty "jmsBrokerURL", "tcp://${ftWebHost}:61616"
if (project.hasProperty("apiDebugOutput")) {
systemProperty "debug.api.testing", "${apiDebugOutput}"
}
if(project.hasProperty("ftWebPort")){
systemProperty "restassured.base.port", "${ftWebPort}"
}
if(project.hasProperty("ftWebSecure")){
systemProperty "restassured.secure.connection", "${ftWebSecure}"
}
if(project.hasProperty("payURL"))
setSystemProperty "pay.url", "${payURL}"
systemProperty "pay.url", "${payURL}"
if(project.hasProperty("formTHost") && project.hasProperty("internalAppFTHost")) {
setSystemProperty "external.host", "${formI90FTHost}/efile/login"
systemProperty "external.host", "${formTHost}/file/login"
setSystemProperty "internal.host", "${internalAppFTHost}/InternalApp/login"
systemProperty "internal.host", "${internalAppFTHost}/InternalApp/login"
}
if(project.hasProperty("ftWebPort") && project.hasProperty("formI90FTHost") && project.hasProperty("internalAppFTHost")) {
setSystemProperty "external.host", "${formI90FTHost}:${ftWebPort}/efile/login"
systemProperty "external.host", "${formI90FTHost}:${ftWebPort}/efile/login"
setSystemProperty "internal.host", "${internalAppFTHost}:${ftWebPort}/InternalApp/login"
systemProperty "internal.host", "${internalAppFTHost}:${ftWebPort}/InternalApp/login"
}
println "Overriding serenity properties for child jvms based on system properties (takes precedence over serenity.properties)..."
net.thucydides.core.util.SystemEnvironmentVariables environmentVariables = new net.thucydides.core.util.SystemEnvironmentVariables();
Map<String, net.thucydides.core.ThucydidesSystemProperty> propertyNameMap = new TreeMap<String, net.thucydides.core.ThucydidesSystemPrope
rty>();
for(net.thucydides.core.ThucydidesSystemProperty property : net.thucydides.core.ThucydidesSystemProperty.values()) {
String key = property.getPropertyName().replaceAll("thucydides.","serenity.");//withSerenityPrefix() method
propertyNameMap.put(key, property);
}
for(String key : propertyNameMap.keySet()){
net.thucydides.core.ThucydidesSystemProperty property = propertyNameMap.get(key);
if(property.isDefinedIn(environmentVariables)) {
String value = property.from(environmentVariables);
println "(O)${key}=${value}"
systemProperty key, value
}
else {
println "( )${key}"
}
}
if(project.hasProperty("maxParallelForks")) {
int forks = project.getProperty("maxParallelForks") as int;
println "Running up to ${forks} test suites in parallel";
maxParallelForks = forks;
}
}
public void setSystemProperty(String key, String value){
System.setProperty(key, value);
println "Set system property "+key+"="+value;
}
task cucumberMonkey(dependsOn: 'compileTestJava', type:JavaExec){
doFirst{
println("Executing cucumber monkey");
classpath = sourceSets.main.output + sourceSets.test.output + sourceSets.main.runtimeClasspath + sourceSets.test.runtimeClasspath
main = 'gov.dhs.uscis.elis2.serenity.utils.cucumbermonkey.CucumberMonkeyRunner'
standardOutput = new FileOutputStream(createSerenityLogFile("CucumberMonkey.txt"));
}
}
task generateCucumberTestSuites (dependsOn: 'processTestResources') {
File root = buildFile.getParentFile();//assumes build.gradle is in root directory
File featureTemplatePath = new File(root, "FeatureFile.template");
File cucumberTemplatePath = new File(root, "CucumberTestSuite.template");
File featureDirectory = new File(root, "src/test/resources/features/");
File outputFeatureDirectory = new File(root, "src/test/resources/autogenerated/");
File testSuitePath = new File(root,"src/test/java/serenity/")
String testSuitePackage = "serenity"
String[] glue = ["serenity.parallel"]
String testSuiteRegex = /CucumberTestSuite\d+.java/
String featureTestRegex = /.*\.feature/
Template cucumberTemplate = readTemplate(cucumberTemplatePath);
Template featureTemplate = readTemplate(featureTemplatePath);
def featureProp = "";
if(project.hasProperty("features")) {
featureProp = features;
}
featureProp = featureProp.split(",");
Set<File> matchedFeatures = filterMatchedFeatures(matchFiles(featureDirectory, featureTestRegex, true), featureProp)
generateCucumberTestSuites(cucumberTemplate, featureTemplate, matchedFeatures, testSuitePath, testSuitePackage, glue, outputFeatureDirect
ory, testSuiteRegex);
}
public Set<File> filterMatchedFeatures(Set<File> files, String[] features) {
if(features.length == 0)
return files;
Set<File> matchedFiles = new TreeSet<File>();
for(File f : files) {
for(String feature : features) {
if(f.getName().contains(feature.trim())) {
matchedFiles.add(f);
break;
}
}
}
return matchedFiles;
}
public groovy.text.Template readTemplate(File file) {
String rawTemplate = file.getText('UTF-8')
return new groovy.text.SimpleTemplateEngine().createTemplate(rawTemplate);
}
public void writeTemplate(Template template, def templateBinding, File outputFile) {
logger.lifecycle("Writing templated file ${outputFile}")
def templatedResult = template.make(templateBinding).toString()
outputFile << templatedResult;
}
public Set<File> matchFiles(File directory, String matcher, boolean recursive){
Set<File> matchingFiles = new TreeSet<String>();
Closure match = {
if(it.name.matches(matcher)) {
matchingFiles.add(it);
}
}
if(recursive) {
directory.eachFileRecurse(FileType.FILES, match);
}
else {
directory.eachFile(FileType.FILES,match);
}
return matchingFiles;
}
public void scorchDirectory(File directory) {
deleteDirectory(directory);
createDirectory(directory);
}
public void scrubDirectory(File directory, String pattern){
directory.eachFile(FileType.FILES) {
if(it.name.matches(pattern)){
deleteFile(it);
}
}
}
public void createDirectory(File f){
if(!f.exists()) {
logger.lifecycle("Creating ${f}")
f.mkdirs();
}
}
public void createFile(File f){
if(!f.exists()) {
logger.lifecycle("Creating ${f}")
f.createNewFile();
}
}
public void copyFile(File original, File newFile) {
logger.lifecycle("Copying ${original} to ${newFile}.")
newFile.bytes = original.bytes
}
public void deleteDirectory(File f){
if(f.exists()) {
logger.lifecycle("Deleting ${f}")
f.deleteDir();
}
}
public void deleteFile(File f){
if(f.exists()) {
logger.lifecycle("Deleting ${f}")
f.delete();
}
}
public void generateCucumberTestSuites(Template cucumberTemplate, Template featureTemplate, Set<File> featureFiles, File testSuiteFolder, String
testSuitePackage, String[] glue, File outputFeatureFolder, String pattern) {
scrubDirectory(testSuiteFolder, pattern);
scorchDirectory(outputFeatureFolder);
int count = 0;
for(File featureFile : featureFiles) {
File featureDirectory = new File(outputFeatureFolder, "feature${count}")
createDirectory(featureDirectory);
File newFeatureFile = new File(featureDirectory, featureFile.getName())
def featureTemplateBinding = [
"GENERATED_DATE":new Date().toString(),
"FEATURE_FILE_CONTENT":featureFile.getText("UTF-8")
]
writeTemplate(featureTemplate, featureTemplateBinding, newFeatureFile);
String generatedDate = new Date().toString();
String packageName = testSuitePackage;
String featureDirectoryString = featureDirectory.getCanonicalPath().replace("\\", "/")
String testSuiteName = "CucumberTestSuite${count}"
String joinedGlue = glue.collect{"\""+it+"\""}.join(",");
def cucumberTemplateBinding = [
"GENERATED_DATE":generatedDate,
"PACKAGE_NAME":packageName,
"FEATURE_DIRECTORY":featureDirectoryString,
"TEST_SUITE_NAME":testSuiteName,
"GLUE":joinedGlue
]
String testSuiteFileName = "${testSuiteName}.java";
if(!testSuiteFileName.matches(pattern)) {
throw new Exception("Generated file name ${testSuiteFileName} does not match regex ${pattern}");
}
writeTemplate(cucumberTemplate, cucumberTemplateBinding, new File(testSuiteFolder, testSuiteFileName))
count++;
}
}
task uberJar(type: Jar,dependsOn:[':compileJava',':compileGroovy']) {
zip64 true
from files(sourceSets.main.output.classesDir)
from configurations.runtime.asFileTree.files.collect { zipTree(it) }
with jar
manifest {
attributes 'Main-Class': mainClassName
}
}
gradle.startParameter.continueOnFailure = true
最佳答案
您需要添加特征文件的保存位置,例如:
@CucumberOptions(格式= {“”漂亮“},单色= true,功能= {
“src / test / resources / features /”} )。
另外格式的选项也已弃用,请尝试使用插件。同时添加胶水的位置(步骤定义)
关于gradle - CucumberWithSerenity:initializationError(serenity.TestRunner):net/thucydides/core/guice/Injectors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928459/
主要思想是将 EF Core nuget 包添加到 .NET Core 库项目,然后在一堆应用程序(例如 ASP.NET Core、Win 服务、控制台应用程序)中使用该库,而无需在每个应用程序中配置
我想要实现的是编写一个简单的.net核心后台工作程序(.net core 3.1)的代码,在该工作程序作为Windows服务运行时,我在其中将数据写入SQL Server数据库(通过EF Core 3
关于 .Net Core SDK download page 二进制文件有什么用?它与安装程序有何不同? 最佳答案 二进制文件是 .NET Core 的编译代码。它们拥有运行 .NET Core 所需
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
.NET Core 和 ASP.NET Core 到底有什么区别? 它们是相互排斥的吗?我听说 ASP.NET Core 是基于 .NET Core 构建的,但它也可以基于完整的 .NET 框架构建。
我对 ASP.NET Core 开发完全陌生。我正在尝试使用单个模型和 mysql 创建一个简单的 asp.net core Web api 来存储模型数据,然后我想使用 Swagger 将其作为 R
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
好吧,作为一个新的 .net 开发生态系统,我有点迷失在核心工具、版本等方面。 有人可以解释我之间的区别吗 VS 2015 核心工具预览版 x - See here .NET Core/SDK 与否
我已阅读有关如何通过信号器核心集线器从后台服务向客户端发送通知的文档。如何从客户端接收到后台服务的通知? 后台服务应该只是一个单例。 public class Startup { public
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
非常简单的问题: 我正在尝试创建一个像这样的谓词构建器: var predicate = PredicateBuilder.False(); 但似乎在Net Core和EF Core中不可用。
在 .NET Core 自包含应用程序 中...我们需要在 project.json 中指定运行时 (RID) 我们希望我们的应用程序针对...发布为什么会这样? .NET Core 是跨平台的,与我
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
今天我正在学习新的 ASP.net 核心 API 3.1,我想将我的旧网站从 MVC4 转移到 Web API。除了一件事,一切都很好。数据库连接。在我的旧网站中,我为每个客户端(10/15 数据库)
我在 Visual Studio 2015 Update 3 和 .NET Core 1.0 中工作。我有一个 .NETCoreApp v1.0 类型的 Web API 项目。当我添加一个 .NET
我一直在尝试遵循 Ben Cull ( http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-proj
当我打开我的 vs 代码程序时,我收到以下消息: 无法找到 .NET Core SDK。 .NET Core 调试将不会启用。确保 .NET Core SDK 已安装并且在路径上。 如果我安装甚至卸载
我偶然发现了一个非常奇怪的问题。每当 Web 应用程序启动时,dotnet.exe 都会使用相当多的内存(大约 300M)。然而,当它触及某些部分时(我感觉这与 EF Core 使用有关),它会在短时
ASP.NET Core Web (.NET Core) 与 ASP.NET Core Web (.NET Framework) 有什么区别? .NET Framework 是否提供 similar
我是一名优秀的程序员,十分优秀!