Requêtes et réponses attendues dans le même fichier
Hurl est un outil en ligne de commande publié par Orange qui exécute des requêtes HTTP décrites dans un fichier texte .hurl. Sous chaque requête, on écrit la réponse attendue : code de statut, en-têtes, puis assertions sur le corps. Le réseau passe par libcurl, et les options reprises de curl gardent la même sémantique. Sans option, Hurl affiche la dernière réponse comme curl ; --test la remplace par un bilan. Dans les deux cas, une assertion qui échoue donne le code de sortie 4.
POST https://api.example.org/jobs
HTTP 201
[Captures]
job_id: jsonpath "$.id"
GET https://api.example.org/jobs/{{job_id}}
[Options]
retry: 10
retry-interval: 500ms
HTTP 200
[Asserts]
jsonpath "$.state" == "COMPLETED"
duration < 1000
certificate "Expire-Date" daysAfterNow > 15
Le second appel est rejoué jusqu'à dix fois, à 500 ms d'intervalle, tant qu'une de ses assertions échoue.
JSONPath, XPath et assertions sur cookies, certificats et durée
- JSONPath (module conforme à la RFC 9535 depuis la 8.0), XPath pour le HTML et le XML, expressions régulières.
- Des requêtes moins courantes : attributs
Secure,HttpOnlyetSameSited'un cookie, date d'expiration et noms alternatifs du certificat TLS, SHA-256 du corps, version HTTP, adresse IP du serveur, temps de réponse. - Les captures passent un jeton ou un identifiant d'une requête à la suivante.
- Les valeurs passées avec
--secretou capturées avecredactsont masquées dans les journaux et les rapports. - Rapports HTML, JSON, JUnit et TAP ; le rapport HTML détaille les temps de chaque requête.
--curlexporte chaque requête en commande curl, ethurlfmt --in curlconvertit une commande curl en fichier Hurl.
Polling de jobs, connexion CSRF et tests de charge
- Attendre la fin d'un job asynchrone en interrogeant son état avec
retry. - Rejouer sans navigateur une connexion par formulaire protégée par un jeton CSRF, lu en XPath dans la page.
- Faire échouer la CI quand un certificat approche de son échéance, avec
certificate "Expire-Date" daysAfterNow > 15. - Charger un endpoint avec
--repeatet--jobs. La documentation conseille dix fichiers de 10 000 requêtes plutôt que 100 000 fichiers d'une seule requête, qui risquent d'épuiser les ports TCP éphémères.
Terminal seulement, libcurl du système et options renommées en 8.0
Le projet se démarque des clients graphiques et des navigateurs pilotés. Sa FAQ juge Postman, orienté interface graphique, moins attrayant qu'une ligne de commande, et Karate plus complet mais plus complexe. Face à Selenium, elle soutient que le HTTP brut, sans navigateur headless, rend les faux positifs très rares.
Aucune interface graphique ni moteur JavaScript. À la question « pourquoi ne pas utiliser Hurl ? », la FAQ répond : si vous avez besoin d'une interface graphique. Hurl ne voit que ce que renvoie le serveur ; une page construite par JavaScript relève d'un navigateur piloté comme Playwright.
Un binaire lié à la libcurl du système. Le README annonce un binaire unique sans runtime, mais la FAQ montre un exécutable lié dynamiquement à libcurl et libxml2 : si la libcurl installée ne gère pas HTTP/2, Hurl n'en enverra pas. hurl --version indique la libcurl utilisée. Le binaire Linux précompilé exige la glibc 2.35 ou plus récente, et Windows demande d'installer à part le Visual C++ Redistributable.
Un fichier par scénario. En mode --test, les fichiers tournent en parallèle sans rien partager : les requêtes d'un même fichier s'exécutent dans l'ordre et partagent cookies et captures, mais rien ne passe d'un fichier à l'autre. Les gabarits se limitent aux variables et à quelques fonctions (newUuid, newDate) : la date du lendemain se calcule dans le shell avant l'appel.
Dernière version : 8.0.1, publiée le 29 avril 2026. Elle corrige la prise en charge du _ dans la notation abrégée des membres JSONPath, deux jours après une 8.0.0 aux changements incompatibles : --ignore-asserts devient --no-assert, les variables d'environnement HURL_foo laissent la place à HURL_VARIABLE_foo et l'option --interactive disparaît. Aucune version depuis, mais la branche principale reçoit encore des commits en octobre 2026.
