Essaim
Sur de vrais téléphones

Vos tests Android sur un essaim de vrais téléphones

Vous poussez vos APK, Essaim répartit la suite sur plusieurs appareils réels et agrège les résultats JUnit. Chaque appareil rend son verdict, ses journaux et ses captures : le shard qui échoue est identifié, pas deviné.

Sans carte bancaire pour commencer. Paiement sécurisé par Stripe quand vous changez d'offre.

Votre suite 42 tests 3 shards Redmi Note 13 shard 1 · 14 tests SM-X110 · tablette shard 2 · 14 tests autre appareil shard 3 · 14 tests JUnit agrégé 42 tests 0 échec · 0 doublon exit 0

Trois shards en parallèle, un seul résultat JUnit.

Ce que ça fait

Concrètement

Sharding déterministe

Un run d'instrumentation se découpe par classes (`extra.class`), pas à l'aveugle : chaque shard sait exactement quelles classes il exécute. L'agrégation repère les tests exécutés deux fois et ceux qui n'ont jamais tourné.

Agrégation JUnit

Essaim relit le JUnit XML de chaque appareil, calcule les totaux et détaille les échecs. Le code de sortie est 0 si tout est vert, 1 sinon — dans votre CI, il bloque la fusion.

Des minutes, pas des crédits opaques

L'unité de compte est la minute d'appareil. Le coût d'un run est calculé avant de le lancer, un minimum est réservé à la création, et le débit réel est ajusté à la fin.

API, CLI et webhook

`POST /api/v1/runs`, la CLI `essaim run --app app.apk --test app-test.apk --devices pixel,samsung-a`, et un webhook `run.completed` signé HMAC (X-Hangar-Signature).

Les dépôts restent chez le socle

Essaim ne stocke aucun octet : le dépôt est relayé à Hangar, et le client ne parle qu'à Essaim grâce à une URL signée qui lui appartient. Les artefacts sont servis de la même façon.

Agrégation

Un seul tableau, à la fin

Chaque appareil rend son JUnit XML. Essaim les relit, additionne, et repère ce qu'une addition naïve laisse passer : un test exécuté deux fois, un test qui n'a jamais tourné.

essaim run --app app.apk --test app-test.apk --devices pixel,samsung-a
ShardAppareilClassesTestsÉchecsDurée
1Redmi Note 13LoginTest, CartTest1401 min 12
2SM-X110 (tablette)SearchTest, ProfileTest14058 s
3autre appareilCheckoutTest, SettingsTest1401 min 03
Agrégé6 classes4202 min 04

exécutés deux fois : 0 · jamais exécutés : 0 · exit 0

Le code de sortie est 0 si tout est vert, 1 sinon : dans votre CI, c'est lui qui bloque la fusion.

En toute franchise

Ce que nous ne faisons pas

Un produit qui cache ses limites fait perdre du temps à tout le monde. Voici les nôtres, aujourd'hui.

  • Un run d'instrumentation exige `test_package` : Essaim ne lit pas les APK et le socle en a besoin. Sans lui, 400.
  • Aucune vidéo par appareil : ni l'instrumentation ni les flows n'en produisent aujourd'hui (seul un job `capture` enregistre l'écran côté socle).
  • La matrice multi-modèles et le robot d'exploration (`monkey`) ne sont pas faits.
  • La GitHub Action, la GitHub App (build par Essaim) et le build dans notre infra sont en phase 2.
  • Un dépôt est tamponné en mémoire (256 Mio par défaut) avant d'être relayé à Hangar : pas de streaming.
  • Un run de flows coûte deux jobs (`install` puis `flow`) : le socle n'a pas de job combinant les deux. Et Maestro ne s'installe pas sur MIUI tant que « Installer via USB » n'est pas activé.
Questions

Questions fréquentes

Puis-je lancer un run d'instrumentation sans `test_package` ?

Non : le socle lance `am instrument <paquet>/<runner>` et Essaim ne lit pas les APK. Sans `test_package`, la requête est refusée en 400.

Y a-t-il une vidéo par appareil ?

Pas aujourd'hui. Côté socle, seul un job `capture` enregistre l'écran : le paramètre `record_video` d'un job `flow` est accepté mais ignoré. Les preuves livrées sont `junit.xml`, `tests.json`, `instrument.log` et `logcat.txt` pour l'instrumentation ; `report.xml`, `steps.json`, `maestro.log` et les captures pour les flows.

Le mode synchrone attend-il la fin du run ?

Au maximum 120 secondes. Au-delà, la réponse est 202 et il faut interroger le run — ou écouter le webhook `run.completed`.

Puis-je lancer une matrice de plusieurs modèles ?

Pas en phase 1. Le sélecteur vise un modèle ou une version d'Android, mais la matrice multi-modèles et le robot d'exploration (`monkey` sans nom de paquet) ne sont pas faits : le socle exige le paquet, qu'Essaim ne sait pas lire dans un APK.

Essayez sur un vrai téléphone

Créez un compte, prenez une clé, lancez votre premier test. C'est gratuit pour commencer.