2017-07-31 11 views
14

J'expérimente avec sharding test sur Android et je suis d'obtenir des résultats assez étranges:bizarre test Android sharding

+ adb -s emulator-5580 shell am instrument -e numShards 2 -e shardIndex 0 -e class com.package.etc.automation.Tests.SanityTest.SanityTest -w com.package.etc.test/android.support.test.runner.AndroidJUnitRunner 

com.package.etc.automation.Tests.SanityTest.SanityTest:.......... 

Time: 306.578 

OK (10 tests) 


+ adb -s emulator-5582 shell am instrument -e numShards 2 -e shardIndex 1 -e class com.package.etc.automation.Tests.SanityTest.SanityTest -w com.package.etc.test/android.support.test.runner.AndroidJUnitRunner 

com.package.etc.automation.Tests.SanityTest.SanityTest:...................... 

Time: 645.723 

OK (22 tests) 

Comme vous pouvez le voir, adb diviser les essais en deux groupes inégaux. Le second a deux fois plus de tests que le premier et s'exécute deux fois plus longtemps. Pas le meilleur parallélisme si vous me demandez.

Existe-t-il une possibilité de contrôler la distribution des tests, ou au moins de forcer adb à répartir les tests de façon égale?

Répondre

5

Trouvons les traces. Lorsque la suite de tests est started, TestRequestBuilder est construit sur JUnit Filters. ShardingFilter est l'un d'eux et is added. L'ajouter signifie que Filter a été ajouté "intersected" avec un nouveau - la méthode public boolean shouldRun(Description description) est invoquée. Si vous regardez, plus probable à ce fragment:

if (description.isTest()) { 
    return (Math.abs(description.hashCode()) % mNumShards) == mShardIndex; 
} 

Et en remplaçant vos numéros (numShards=2), vous remarquerez, que ce soit juste un test de parité. Statistiquement, il peut arriver que la distribution de parité HashCode générée ne soit pas de 50%. En outre, lorsque certains tests de votre classe de test sont ignorés, désactivés et entrelacés avec des tests activés, vous pouvez encore plus déranger la méthode particulière hashcode (Junit DescriptionuniqueId générée à partir de la méthode et du nom de classe).

C'est juste des statistiques. Comme vous pouvez le voir dans this answer:

Comment les groupes sont divisés est arbitraire

+0

menu déroulant Nice, monsieur. – azizbekian