You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义目录结构的Gradle项目中配置Karate测试

自定义Gradle目录下配置Karate测试

问题描述

项目采用非标准目录结构,无默认的src/main和src/test目录,结构如下:

my_project/
└── src/
    └── systemTest/
        ├── java/
        └── resources/

需求:

  • 为系统测试、集成测试等不同类型测试创建独立的source set
  • 正确配置Karate依赖与测试任务
  • 适配Gradle环境(Maven相关方案不适用)

当前使用的build.gradle配置无法正常工作,内容如下:

plugins {
    id 'java'
}

dependencies {
    implementation "com.intuit.karate:karate-junit5:1.4.1"
}

sourceSets {
    test {
        resources {
            srcDir file('src/systemTest/java')
            exclude '**/*.java'
        }
    }
}

configurations.all {
    resolutionStrategy {
        force 'com.intuit.karate:karate-junit5:1.4.1'
    }
}

test {
    useJUnitPlatform()
    systemProperty "karate.options", System.properties.getProperty("karate.options")
    systemProperty "karate.env", System.properties.getProperty("karate.env")
    outputs.upToDateWhen { false }
}

repositories {
    mavenCentral()
    // mavenLocal()
}

task karateDebug(type: JavaExec) {
    classpath = sourceSets.test.runtimeClasspath
    main = 'com.intuit.karate.cli.Main'
}

解决方案

1. 定义自定义Source Set

放弃默认的test source set,为每种测试类型创建独立的source set,明确指定Java类和资源文件目录:

sourceSets {
    systemTest {
        java {
            srcDir 'src/systemTest/java'
        }
        resources {
            srcDir 'src/systemTest/resources'
        }
        // 若测试需要依赖主应用代码,取消下面注释(需确保主代码有对应的source set)
        // compileClasspath += sourceSets.main.output
    }
    integrationTest {
        java {
            srcDir 'src/integrationTest/java'
        }
        resources {
            srcDir 'src/integrationTest/resources'
        }
    }
}

2. 配置测试依赖

为每个自定义source set添加Karate和JUnit 5的必要依赖:

dependencies {
    // 系统测试依赖
    systemTestImplementation "com.intuit.karate:karate-junit5:1.4.1"
    systemTestRuntimeOnly "org.junit.platform:junit-platform-launcher"
    
    // 集成测试依赖(与系统测试一致,可按需调整版本或依赖)
    integrationTestImplementation "com.intuit.karate:karate-junit5:1.4.1"
    integrationTestRuntimeOnly "org.junit.platform:junit-platform-launcher"
}

3. 创建测试任务

为每个source set创建对应的Test任务,配置JUnit Platform、Karate参数和测试报告:

// 系统测试任务
task systemTest(type: Test) {
    description = '执行Karate系统测试'
    group = 'Verification'
    
    testClassesDirs = sourceSets.systemTest.output.classesDirs
    classpath = sourceSets.systemTest.runtimeClasspath
    
    useJUnitPlatform()
    
    // 传递Karate命令行参数,默认空值
    systemProperty "karate.options", System.getProperty("karate.options", "")
    // 指定测试环境,默认dev
    systemProperty "karate.env", System.getProperty("karate.env", "dev")
    
    // 禁用任务缓存,确保每次都执行最新测试
    outputs.upToDateWhen { false }
    
    // 启用HTML和XML测试报告
    reports {
        html.required = true
        xml.required = true
    }
}

// 集成测试任务
task integrationTest(type: Test) {
    description = '执行Karate集成测试'
    group = 'Verification'
    
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
    
    useJUnitPlatform()
    
    systemProperty "karate.options", System.getProperty("karate.options", "")
    systemProperty "karate.env", System.getProperty("karate.env", "dev")
    
    outputs.upToDateWhen { false }
    
    reports {
        html.required = true
        xml.required = true
    }
}

4. 配置Karate调试任务

添加调试任务,支持通过Karate CLI运行单个测试或调试:

task systemTestDebug(type: JavaExec) {
    description = '通过Karate CLI调试系统测试'
    group = 'Verification'
    
    classpath = sourceSets.systemTest.runtimeClasspath
    main = 'com.intuit.karate.cli.Main'
    
    // 传递调试参数,默认空值
    args System.getProperty("karate.args", "")
}

完整配置文件

整合以上内容后的build.gradle:

plugins {
    id 'java'
}

repositories {
    mavenCentral()
    // mavenLocal()
}

sourceSets {
    systemTest {
        java {
            srcDir 'src/systemTest/java'
        }
        resources {
            srcDir 'src/systemTest/resources'
        }
    }
    integrationTest {
        java {
            srcDir 'src/integrationTest/java'
        }
        resources {
            srcDir 'src/integrationTest/resources'
        }
    }
}

dependencies {
    systemTestImplementation "com.intuit.karate:karate-junit5:1.4.1"
    systemTestRuntimeOnly "org.junit.platform:junit-platform-launcher"
    
    integrationTestImplementation "com.intuit.karate:karate-junit5:1.4.1"
    integrationTestRuntimeOnly "org.junit.platform:junit-platform-launcher"
}

configurations.all {
    resolutionStrategy {
        force 'com.intuit.karate:karate-junit5:1.4.1'
    }
}

task systemTest(type: Test) {
    description = '执行Karate系统测试'
    group = 'Verification'
    
    testClassesDirs = sourceSets.systemTest.output.classesDirs
    classpath = sourceSets.systemTest.runtimeClasspath
    
    useJUnitPlatform()
    
    systemProperty "karate.options", System.getProperty("karate.options", "")
    systemProperty "karate.env", System.getProperty("karate.env", "dev")
    
    outputs.upToDateWhen { false }
    
    reports {
        html.required = true
        xml.required = true
    }
}

task integrationTest(type: Test) {
    description = '执行Karate集成测试'
    group = 'Verification'
    
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
    
    useJUnitPlatform()
    
    systemProperty "karate.options", System.getProperty("karate.options", "")
    systemProperty "karate.env", System.getProperty("karate.env", "dev")
    
    outputs.upToDateWhen { false }
    
    reports {
        html.required = true
        xml.required = true
    }
}

task systemTestDebug(type: JavaExec) {
    description = '通过Karate CLI调试系统测试'
    group = 'Verification'
    
    classpath = sourceSets.systemTest.runtimeClasspath
    main = 'com.intuit.karate.cli.Main'
    
    args System.getProperty("karate.args", "")
}

// 可选:将测试任务加入check生命周期,执行check时自动运行所有测试
check.dependsOn systemTest, integrationTest

使用示例

  • 运行系统测试:./gradlew systemTest
  • 运行集成测试:./gradlew integrationTest
  • 调试单个Feature文件:./gradlew systemTestDebug -Dkarate.args="--test MyFeature.feature"
  • 指定测试环境:./gradlew systemTest -Dkarate.env=prod

内容的提问来源于stack exchange,提问作者Jigar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:31:05