如何防止特定风格的单元测试被编译成另一种风格?
How do I prevent a flavor specific unit test from being compiled in another flavor?
我正在尝试这样做,但是只有一个维度,所以更简单:
app 模块 build.gradle 指定 2 种口味,免费和收费:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-
optimize.txt'), 'proguard-rules.pro'
}
}
flavorDimensions 'someFlavor'
productFlavors {
premium {
applicationIdSuffix '.premium'
}
free
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
debug.java.srcDirs += 'src/debug/kotlin'
release.java.srcDirs += 'src/release/kotlin'
free {
java.srcDirs += 'src/free/kotlin'
test.java.srcDirs += 'src/test/kotlin'
}
premium {
java.srcDirs += 'src/premium/kotlin'
test.java.srcDirs += ['src/test/kotlin',
'src/testPremium/kotlin']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:design:28.0.0'
}
Android Studio 的项目视图显示:
app
src
free
kotlin (empty folder for now)
main
java
com.example.myapplication
MainActivity.java
premium
kotlin
com.example.myapplication
PremiumFile.kt
test
kotlin
com.example.myapplication
MainTest.kt
testPremium
kotlin
com.example.myapplication
PremiumTest.kt
PremiumFile.kt
class PremiumFile {
companion obnject {
const val PREMIUM_NUM = 10
}
}
MainTest.kt
class MainTest {
@Test
fun basicMainTest() {
assertEquals(1, 1)
}
}
PremiumTest.kt
class PremiumTest {
@Test
fun premiumTest() {
assertEquals(PremiumFile.Premium_NUM, 1)
}
}
如您所见,我缺少任何针对免费版本的单元测试。我预计 运行 ./gradlew compileFreeReleaseUnitTestKotlin
会编译 src/test
内的共享单元测试,但它也会编译 src/testPremium
内的高级单元测试。如何确保 PremiumTest.kt 仅针对高级任务编译,例如 ./gradlew compilePremiumReleaseUnitTestKotlin
?
如果您 运行 gradlew sourceSets
在您的项目中,您将获得以下部分:
test
----
Compile configuration: testCompile
build.gradle name: android.sourceSets.test
Java sources: [app\src\test\java, app\src\test\kotlin, app\src\testPremium\kotlin]
Java-style resources: [app\src\test\resources]
testPremium
-----------
Compile configuration: testPremiumCompile
build.gradle name: android.sourceSets.testPremium
Java sources: [app\src\testPremium\java]
Java-style resources: [app\src\testPremium\resources]
如您所见,app\src\testPremium\kotlin
在主要 test
配置中,而不是在 testPremium
中。并且因为 test
在所有风格中共享,它的来源包含在所有风格中(例如 testFree
配置将包括在 test
和 testFree
配置中指定的来源)。 =31=]
它还建议您如何解决问题 - 在配置块中使用 testPremium
。所以而不是
premium {
java.srcDirs += 'src/premium/kotlin'
test.java.srcDirs += ['src/test/kotlin', 'src/testPremium/kotlin']
}
写
premium {
java.srcDirs += 'src/premium/kotlin'
}
test{
java.srcDirs += 'src/test/kotlin'
}
testPremium {
java.srcDirs += 'src/testPremium/kotlin'
}
所以gradlew sourseSets
会给你:
test
----
Compile configuration: testCompile
build.gradle name: android.sourceSets.test
Java sources: [app\src\test\java, app\src\test\kotlin]
Java-style resources: [app\src\test\resources]
testPremium
-----------
Compile configuration: testPremiumCompile
build.gradle name: android.sourceSets.testPremium
Java sources: [app\src\testPremium\java, app\src\testPremium\kotlin]
Java-style resources: [app\src\testPremium\resources]
因为 test
不存在于 AndroidSourceSet
中,所以它不是 'type' 来源,如 'java'、'resources' 等。相反,test
是 AndroidSourceSet
的另一个实例。因此,当您编写 test.java.srcDirs
时,您实际上是在配置这个顶级 test
源集,而不是 premium
.
中的测试
我正在尝试这样做,但是只有一个维度,所以更简单:
app 模块 build.gradle 指定 2 种口味,免费和收费:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-
optimize.txt'), 'proguard-rules.pro'
}
}
flavorDimensions 'someFlavor'
productFlavors {
premium {
applicationIdSuffix '.premium'
}
free
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
debug.java.srcDirs += 'src/debug/kotlin'
release.java.srcDirs += 'src/release/kotlin'
free {
java.srcDirs += 'src/free/kotlin'
test.java.srcDirs += 'src/test/kotlin'
}
premium {
java.srcDirs += 'src/premium/kotlin'
test.java.srcDirs += ['src/test/kotlin',
'src/testPremium/kotlin']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:design:28.0.0'
}
Android Studio 的项目视图显示:
app
src
free
kotlin (empty folder for now)
main
java
com.example.myapplication
MainActivity.java
premium
kotlin
com.example.myapplication
PremiumFile.kt
test
kotlin
com.example.myapplication
MainTest.kt
testPremium
kotlin
com.example.myapplication
PremiumTest.kt
PremiumFile.kt
class PremiumFile {
companion obnject {
const val PREMIUM_NUM = 10
}
}
MainTest.kt
class MainTest {
@Test
fun basicMainTest() {
assertEquals(1, 1)
}
}
PremiumTest.kt
class PremiumTest {
@Test
fun premiumTest() {
assertEquals(PremiumFile.Premium_NUM, 1)
}
}
如您所见,我缺少任何针对免费版本的单元测试。我预计 运行 ./gradlew compileFreeReleaseUnitTestKotlin
会编译 src/test
内的共享单元测试,但它也会编译 src/testPremium
内的高级单元测试。如何确保 PremiumTest.kt 仅针对高级任务编译,例如 ./gradlew compilePremiumReleaseUnitTestKotlin
?
如果您 运行 gradlew sourceSets
在您的项目中,您将获得以下部分:
test
----
Compile configuration: testCompile
build.gradle name: android.sourceSets.test
Java sources: [app\src\test\java, app\src\test\kotlin, app\src\testPremium\kotlin]
Java-style resources: [app\src\test\resources]
testPremium
-----------
Compile configuration: testPremiumCompile
build.gradle name: android.sourceSets.testPremium
Java sources: [app\src\testPremium\java]
Java-style resources: [app\src\testPremium\resources]
如您所见,app\src\testPremium\kotlin
在主要 test
配置中,而不是在 testPremium
中。并且因为 test
在所有风格中共享,它的来源包含在所有风格中(例如 testFree
配置将包括在 test
和 testFree
配置中指定的来源)。 =31=]
它还建议您如何解决问题 - 在配置块中使用 testPremium
。所以而不是
premium {
java.srcDirs += 'src/premium/kotlin'
test.java.srcDirs += ['src/test/kotlin', 'src/testPremium/kotlin']
}
写
premium {
java.srcDirs += 'src/premium/kotlin'
}
test{
java.srcDirs += 'src/test/kotlin'
}
testPremium {
java.srcDirs += 'src/testPremium/kotlin'
}
所以gradlew sourseSets
会给你:
test
----
Compile configuration: testCompile
build.gradle name: android.sourceSets.test
Java sources: [app\src\test\java, app\src\test\kotlin]
Java-style resources: [app\src\test\resources]
testPremium
-----------
Compile configuration: testPremiumCompile
build.gradle name: android.sourceSets.testPremium
Java sources: [app\src\testPremium\java, app\src\testPremium\kotlin]
Java-style resources: [app\src\testPremium\resources]
因为 test
不存在于 AndroidSourceSet
中,所以它不是 'type' 来源,如 'java'、'resources' 等。相反,test
是 AndroidSourceSet
的另一个实例。因此,当您编写 test.java.srcDirs
时,您实际上是在配置这个顶级 test
源集,而不是 premium
.