Gradle无法在相关测试项目

时间:2016-04-19 17:30:40

标签: java gradle gradlew multi-project

我试图为嵌套的多项目结构运行./gradlew build,而且我遇到的问题似乎只出现在具有测试源根的项目中。作为java和gradle的新手,我确信我打破了多个约定,但我仍然认为这应该有效。

基本上,所有依赖项似乎都添加得很好,但是当我有一个项目只有一个Test srcDir依赖于另一个具有Test srcDir的项目时,它不会识别该root中的包/符号项目。但是,定期srcDirs(不测试)的项目似乎没有问题。

我的项目比这更多,但这是我尝试过的最简单的设置来说明问题。

我的项目结构:

qatests
    /Applications
        /AppGroupName
            /AppBasePageObjects
                /src
            /AppBaseTests
                /src
    /BasePageObjects
        /src
    /BaseTests
        /src

我的settings.gradle in qatests:

rootProject.name = 'QaTests'
include 'BasePageObjects'
include 'BaseTests'
include 'Applications:AppGroupName'
include 'Applications:AppGroupName:AppBasePageObjects'
include 'Applications:AppGroupName:AppBaseTests'

我在qatests中的build.gradle:

version '1.0-SNAPSHOT'

allprojects {
    repositories {
        mavenCentral()
    }
}

subprojects{

    if(project.name.contains("Tests")){
        apply plugin: 'java'
        sourceCompatibility = 1.8
        dependencies {
            testCompile group: 'junit', name: 'junit', version: '4.11'
            compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '2.+'
        }

        if(project.name != "BaseTests")
        {
            println "$project.name depends on BaseTests"
            dependencies {
                testCompile project(':BaseTests')
            }
        }

        sourceSets {
            test {
                java {

                    srcDir 'src'
                }
            }
        }
    }

    if(project.name.contains("PageObjects")){
        apply plugin: 'java'
        sourceCompatibility = 1.8
        dependencies {
            compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '2.+'
        }

        if(project.name !="BasePageObjects")
        {
            dependencies {
                compile project(':BasePageObjects')
            }
        }

        sourceSets {
            main {
                java {

                    srcDir 'src'
                }
            }
        }
    }
}

我不会在baseTest项目中包含我的build.grade,因为在gradlew构建期间它似乎编译得很好,但这是我的App.BaseTests的build.gradle:

version '1.0-SNAPSHOT'

dependencies {
    compile 'org.apache.commons:commons-lang3:3.4'
    compile project(':Applications:AppGroupName:AppBasePageObjects')
}

当我在qatests根目录中运行./gradlew build时,BaseTestsBasePageObjectsAppBasePageObjects项目似乎编译良好,AppBasePageObjects成功使用了包来自BasePageObjects的符号。但是,出于某种原因,AppBaseTests似乎无法识别BaseTests中的包和符号。

如果我从头开始克隆这个项目,IntelliJ会自动运行gradle脚本脚本,所有内容似乎都可以正常使用依赖项,所以这让我更加困惑。

我尝试为所有项目依赖项添加编译和测试编译,因为这是AppBasePageObjects工作和AppBaseTests之间唯一真正的区别,它不起作用。我还尝试将compileJava.dependsOn(':BaseTests:build')添加到AppBaseTests build.gradle文件中。还有一些其他兔子洞,但似乎没有任何影响这个依赖性问题。

对于它的价值,这是我在实际构建中看到的第一个错误:

error: package Tests does not exist import Tests.BaseTest;

非常感谢任何帮助或建议。如果你想分发一些严厉的侮辱,我也会采取这些措施。谢谢。

1 个答案:

答案 0 :(得分:0)

我相信我在阅读另一个解决方案时找到了答案: Multi-project test dependencies with gradle

在我的root build.gradle文件中,似乎我需要使用testCompile project(':BaseTests').sourceSets.test.output进行命令行构建以及testCompile project(':BaseTests')用于IDE功能。这似乎只是测试项目所必需的。

以下是我的root build.gradle文件中的实际更改:

    if(project.name != "BaseTests")
    {
        println "$project.name depends on BaseTests"
        dependencies {
            testCompile project(':BaseTests')
            testCompile project(':BaseTests').sourceSets.test.output
        }
    }

这看起来有点hacky但有效,如果有人有更彻底和更聪明的答案请发帖!