[英]Gradle: optimize running tests in parallel
我正在嘗試Gradle並行運行測試的功能。 我發現的主要設置是“ 測試”任務的maxParallelForks
屬性。 我希望該設置的行為類似於讓Executors.newFixedThreadPool
執行測試。 即,一定數量的線程(在Gradle情況下為進程)同時執行。 只要有一個線程完成工作,池中就會激活一個新線程。
但是,Gradle的行為在根本上不是最優的方式。 看起來Gradle將測試類划分為等於組的maxParallelForks的數量,然后Gradle為每個組生成一個進程,並讓這些進程並行執行。 這種策略的問題很明顯:它無法根據測試類所需的時間動態調整執行。
例如,假設您有5個類,並將maxParallelForks
設置為2。在這5個類中,有一個很慢,而其余的則相對較快。 一種理想的策略是讓一個進程執行速度較慢的進程,而另一個進程執行快速進程。 但是,Gradle所做的是將慢速的一組與一或兩個快速的一組在一起,並生成兩個進程來執行兩組類,這肯定不理想。
這是一個簡單的演示。
慢課:
class DemoTest {
@Test
void one() {
Thread.sleep( 5000 )
println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
assert 1 == 1
}
@Test
void two() {
Thread.sleep( 5000 )
println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
assert 1 == 1
}
}
快速課程(DemoTest2-4,具有相同的課程正文):
class DemoTest2 {
@Test
void one() {
Thread.sleep( 1000 )
println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
assert 1 == 1
}
@Test
void two() {
Thread.sleep( 1000 )
println System.getProperty('org.gradle.test.worker') + ": " + new Date().format('HH:mm:ss')
assert 1 == 1
}
}
所有的類都在junit
包中,該包恰好與著名的測試框架同名:-)
這是一個可能的輸出:
junit.DemoTest2 > one STANDARD_OUT
2: 14:54:00
junit.DemoTest2 > two STANDARD_OUT
2: 14:54:01
junit.DemoTest4 > one STANDARD_OUT
2: 14:54:02
junit.DemoTest4 > two STANDARD_OUT
2: 14:54:03
junit.DemoTest > one STANDARD_OUT
3: 14:54:04
junit.DemoTest > two STANDARD_OUT
3: 14:54:09
junit.DemoTest3 > one STANDARD_OUT
3: 14:54:10
junit.DemoTest3 > two STANDARD_OUT
3: 14:54:11
junit.DemoTest5 > one STANDARD_OUT
3: 14:54:12
junit.DemoTest5 > two STANDARD_OUT
3: 14:54:13
如您所見,慢類DemoTest
與兩個快速類組合在一起。 如果將快速班級組合在一起,則總運行時間約為13秒,可能是10秒。
因此,是否有任何直接方法可以在Gradle中優化此行為而無需借助自定義JUnit運行器?
非常感謝你。
這只能通過更改Gradle代碼庫來優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.