Přejít k navigační liště

Zdroják » Různé » RoboHydra: nový testovací nástroj pro interakce klient-server

RoboHydra: nový testovací nástroj pro interakce klient-server

Články Různé

RoboHydra je webový server od Opera Software navržený k psaní testů pro programy využívající HTTP jako svůj komunikační protokol. V článku představíme, jak RoboHydra funguje, popíšeme její instalaci a naučíme se ji používat.

Tento text je překladem článku Robohydra: a new testing tool for client-server interactions, jehož autorem je Esteban Manchado Velázquez a je zde zveřejněn pod licencí CC-BY-3.0.

Úvod

HTTP je nejčastěji používaným protokolem na internetu. Používá ho většina API dostupných přes internet. A nejen webové stránky, ale také mobilní aplikace, veřejná API, programy integrující backendové služby a další. Když zvážíme, jak moc programů používá HTTP ke komunikaci s dalšími programy, překvapí nás, že neexistuje zas tak moc nástrojů k testování HTTP komunikace mezi klientem a serverem.

RoboHydra je webserver navržený pro psaní a testování programů, které používají HTTP jako svůj komunikační protokol. RoboHydru můžeme používat mnoha způsoby, níže najdete nejčastější use case:

  1. RoboHydra umožňuje kombinovat lokálně uložený webový frontend s backendem na vzdáleném serveru, můžete tak testovat vaši lokální instalaci frontendu s plně funkčním backendem bez nutnosti instalovat backend lokálně.
  2. Pokud píšete program, který komunikuje se serverem pomocí HTTP, můžete použít RoboHydru, aby tento server imitovala a vracela programu připravené odpovědi. Tím můžete snáz reprodukovat rozličné chyby a situace, které by jinak bylo obtížné nebo dokonce nemožné testovat.

Tento článek vám představí, jak RoboHydra funguje, jak ji můžete nainstalovat a začít ji používat. Na konci se podíváme na první scénář zmíněný výše. Druhým scénářem a pokročilejším použitím RoboHydry se budou zabývat další články na dev.opera.com.

Anatomie RoboHydry

RoboHydra je webový server mající více hlav. Hlava RoboHydry je program, který obsluhuje požadavky na jisté cestě URL a určuje, co má hlava na této URL vykonat. RoboHydra tak může mít například jednu hlavu poslouchající na /articles/newest, která bude vracet pevně daný seznam článků, a vedle ní další hlavu poslouchající na /static, která slouží jako HTTP proxy a přeposílá požadavky na produkční server atd.

Chování každé hlavy je určováno jejím typem. Existují hlavy, které vždy vrací stejnou (fixní) odpověď, dále pak hlavy, které přeposílají požadavky na další server, dále hlavy, které nabízí soubory s lokálního souborového systému, hlavy, které spouští zadanou javascriptovou funkci atd. Můžete si naprogramovat vaše vlastní hlavy a definovat jim chování, jaké chcete.

Když RoboHydra obdrží požadavek, projde popořadě všechny své hlavy a snaží se najít takovou, která odpovídá URL příchozího požadavku. Jakmile takovou hlavu najde, nechá ji požadavek zpracovat.

RoboHydra běží jako balíček Node.JS. Je tedy napsaná v JavaScriptu, ale spouští se z příkazové řádky, nikoliv z prohlížeče (protože to není klient, ale server!).

Instalace RoboHydry

RoboHydru můžete nainstalovat a používat z jakéhokoliv umístění na vašem lokálním disku, ale pro instalaci si musíte zvolit jeden adresář a pracovat v něm. Proto ještě před instalací vytvoříme adresář devo-robohydra, který bude obsahovat všechny soubory vytvořené v tomto článku a také samotnou instalaci RoboHydry. Všechny příkazy spouštějte z tohoto adresáře: RoboHydra k nalezení svých souborů využívá relativních cest.

  • Jako první krok pro instalaci RoboHydry na váš počítač ověřte, zda máte nainstalováno Node.JS (to můžete ověřit zapsáním node -v do terminálu; měli byste mít přinejmenším verzi v0.6.0). Pokud ne, napřed musíte nainstalovat Node.JS. Můžete si ho zkompilovat ze zdrojových kódů nebo si stáhnout binárky (.pkg, .exe apod.) pro vaši platformu — více najdete na nodejs.org.
  • Následně nainstalujte RoboHydru zapsáním npm install robohydra do vaší příkazové řádky. Měli byste tak získat nainstalovanou RoboHydru v adresáři devo-robohydra/node_modules/robohydra. Jakmile jste ji nainstalovali, nebudete už nic v adresáři node_modules měnit.

Poznámka: RoboHydru můžete nainstalovat také stažením RoboHydry přímo z GitHubu a jejím umístěním do ručně vytvořeného adresáře node_modules.

Začínáme s RoboHydrou

Jakmile máte nainstalováno, můžete RoboHydru spouštět přímo z vašeho pracovního adresáře spolu s načtením vaší konfigurace tímto způsobem:

./node_modules/.bin/robohydra configuration-file-name 

Pokud přidáte node_modules/.bin do vaší $PATH, postačí už jen:

robohydra configuration-file-name 

Tj. RoboHydra běží uvnitř adresáře node_modules a vaše konfigurační soubory se nachází ve vašem pracovním adresáři, což je v tomto případě  devo-robohydra.

Konfigurační soubory RoboHydry jsou jednoduché JSON soubory, které obsahují seznam pluginů, jenž mají být načteny. Pluginy jsou speciální skripty, které definují jednu hlavu nebo i více hlav, které chcete nahrát společně. Konfigurační soubor načítající dva pluginy monitor a dev-proxy bude vypadat takto:

{
  "plugins": [
    {"name": "monitor", "config": {}},
    {"name": "dev-proxy", "config": {}}
  ]
}

Pluginy jsou napsané v JavaScriptu a musí se nacházet v podadresáři robohydra/plugins uvnitř vašeho pracovního adresáře.

Ve výchozím stavu budou ukázkové pluginy zmíněné výše načteny z devo-robohydra/robohydra/plugin­s/monitor/index.js a devo-robohydra/robohydra/plugins/dev-proxy/index.js. V příkladu níže si ukážeme, jak si takový plugin můžete od základů napsat.

Další ukázkové pluginy a konfigurační soubory najdete v adresáři devo-robohydra/node_modules/ro­bohydra/examples.

RoboHydra jako proxy

Jak jsme již zmínili, jednou ze situací, ve které je RoboHydra užitečná, je tvorba frontendu webové aplikace. Představte si, že jste jedním z vývojářů frontendu pro http://www.opera.com. Bylo by šikovné mít možnost se připojit z prohlížeče k nějaké URL, která se bude chovat stejně jako opera.com, až na to, že frontend poběží z vašeho lokálního souborového systému a backend bude hostovaný někde jinde, čili nepotřebujete mít celý backend pro opera.com na vašem stroji!

Abychom toho dosáhli, vytvoříme jednoduchý webserver postavený na RoboHydře, který nabízí lokální soubory pro požadavky začínající jistou cestou (např. /js/) a všechny další požadavky (např. /developer/tools) předává na http://www.opera.com.

Píšeme proxy plugin

Vytvoříme proto plugin RoboHydry obsahující dvě hlavy: jedna bude nabízet lokální soubory z /js/ a druhá předávat vše ostatní na http://www.opera.com. Ta první bude nabízet statické soubory, druhá bude proxy hlavou. Kód pluginu bude vypadat takto:

var heads                   = require('robohydra').heads,
    RoboHydraHeadFilesystem = heads.RoboHydraHeadFilesystem,
    RoboHydraHeadProxy      = heads.RoboHydraHeadProxy;

exports.getBodyParts = function(config) {
  var projectPath = config.rootpath || '.';

  return {
    heads: [
      new RoboHydraHeadFilesystem
      (
        {
          name: 'js',
          mountPath: '/js',
          documentRoot: projectPath + '/static/js'
        }
      ),

      // Tato hlava zpracuje všechny požadavky, které
      // nezpracovala žádná hlava uvedená dříve
      new RoboHydraHeadProxy
      (
        {
          name: 'proxy',
          mountPath: '/',
          proxyTo: 'http://www.opera.com',
          setHostHeader: true
        }
      )
    ]
  };
};
  1. Nazveme náš plugin operacom-dev: uložte kód výše jako devo-robohydra/robohydra/plugins/operacom-dev/index.js.
  2. Nyní vytvořte konfigurační soubor operacom-dev.conf v adresáři devo-robohydra s tímto obsahem:

    {
      "plugins": [
        {"name": "operacom-dev", "config": {"rootpath": "operacom"}}
      ]
    }
  3. A jako poslední krok, stáhněte si javascriptové soubory pro www.opera.com a rozbalte je to adresáře devo-robohydra.

Nyní byste měli mít všechny následující soubory a adresáře v devo-robohydra:

  • node_modules, obsahuje nainstalovaný balíček robohydra.
  • robohydra/plugins/operacom-dev, obsahuje váš plugin.
  • operacom-dev.conf, váš konfigurační soubor.
  • adresář operacom/static/js obsahující váš frontend pro www.opera.com.

RoboHydra v akci

Vše je na svém místě, můžete spustit server, je třeba RoboHydře předložit váš konfigurační soubor:

./node_modules/.bin/robohydra operacom-dev.conf

RoboHydra bude nyní poslouchat na portu 3000. Pokud si zobrazíte http://localhost:3000 ve vašem prohlížeči, uvidíte opera.com. Pokud upravíte soubory v adresáři operacom/static/js, uvidíte hned vaše změny: můžete tak být frontendovým vývojářem www.opera.com!

Poznámka: Pokud chcete, aby RoboHydra poslouchala na jiném portu, použijte při startu parametr -p následovaný číslem portu, např. ./node_modules/.bin/robohydra -p 3001 operacom-dev.conf spustí RoboHydru na portu 3001.

Ukažme si vše v akci. Otevřete operacom/static/js/mainmenu.js a najděte následující funkci:

frm.onsubmit=function() {
  if(this.words.value=='Search www.opera.com'||this.words.value=='') {
    alert('Please enter a search term.');
    this.words.focus();
    return false;
  }
}

Pokud kliknete dole na stránce na vyhledávací tlačítko a nenapsali jste nic do vyhledávacího pole, pak se objeví dialog  a upozorní vás, co máte udělat. Pojďme funkci trochu upravit, zobrazíme chybovou hlášku uživateli trochu jiným způsobem:

frm.onsubmit=function() {
  if(this.words.value=='Search www.opera.com'||this.words.value=='') {
    wrd.value = 'Please enter a search term.';
    wrd.style.color = 'black';
    wrd.style.fontWeight = 'bold';
    this.words.focus();
    return false;
  }
}

Uložte váš javascriptový soubor, zobrazte v prohlížeči http://localhost:3000 a spusťte reload, ať zajistíte, že se načte nejnovější verze javascriptových souborů. Pokud nyní na spodku stránky kliknete na vyhledávací tlačítko, aniž byste něco napsali, uvidíte nový efekt. Tím jsme si ukázali, jak je RoboHydra skvělá pro podobné experimenty.

Správcovské rozhraní

Další užitečnou funkcí RoboHydry je administrátorské rozhraní. V něm můžete, kromě jiného, vidět aktuálně dostupné hlavy, vytvářet hlavy s fixním obsahem a také hlavy vypínat a opět zapínat — viz obr. 1. Je dostupný na http://localhost:3000/robohydra-admin/.

The RoboHydra admin interface, showing custom heads, and featuring controls to enable and disable heads as you see fit

Obr. 1: Správcovské rozhraní RoboHydry. Všimněte si v něm našich hlav a tlačítek attach a detach.

Při použití RoboHydry jako frontendové vývojářské proxy můžeme správcovské rozhraní využít k porovnání, jak funguje web s naším lokálními javascriptovým kódem a jak s tím originálním. Stačí jen odpojit (detach) a pak znovu připojit (attach) „js“ hlavu. Po odpojení hlavy bude aktivní pouze „proxy“ hlava, která všechny požadavky přepošle na www.opera.com.

Shrnutí

Tím skončil náš krátký průvodce možnostmi RoboHydry. Měli byste ji být schopni nainstalovat, používat a napsat pro ni jednoduchý plugin. Také byste měli mít představu, jak může být užitečná! V dalších článcích na dev.opera.com vám ukážeme několik zajímavějších a komplexnějších use case, např. emulování serveru pro tvorbu sady testů nebo ukládání sekvence zaslaných dat a jejich pozdější přehrávání, které vám umožní pracovat offline.

Komentáře

Subscribe
Upozornit na
guest
0 Komentářů
Inline Feedbacks
View all comments

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.