簡體   English   中英

Gradle:並行優化運行測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM