automatizované jednotkové testování webové aplikace v Pythonu

#Python #Unittest #Selenium # Automation

v tomto příspěvku se podíváme na to, jak jednotku testovat webovou aplikaci v Pythonu, abychom zkontrolovali správnost funkčnosti. Whoa! Tato věta má hrst žargonu: test jednotky, webová aplikace, a testování funkčnosti.

podívali jsme se na testování jednotek Python program v předchozím příspěvku. Doporučujeme vám projít, pokud nejste obeznámeni s jednotkovým testováním.

co je to jednotkový test?

jednotka je nejmenší testovatelná část programu nebo aplikace.

jednotkové testy se tedy používají k programovému testování každé testovatelné součásti.

můžete testovat backendový program nebo frontendový program, jako je webová aplikace.

pro backendový program byste napsali jednotkový test pro každou funkci nebo metodu v kódu, protože se jedná o logické nejmenší jednotky.

pro frontend však identifikujete různé funkce, které chcete zkontrolovat a podle toho zapsat testy jednotek.

v tomto příspěvku budeme testovat program frontend, konkrétně webovou aplikaci.

co je webová aplikace?

jakákoli aplikace, která se vykresluje ve webovém prohlížeči, jako je Chrome, Firefox nebo Safari.

všechny webové aplikace mají jedno společné-jsou viditelné koncovým uživatelům HTML (Hypertext Markup Language) stránky. HTML je jednoduše formátovací jazyk, který popisuje, jak by se věci měly organizovat. Je to prostě textový soubor.

prohlížeče získají tuto HTML stránku a interpretují značky (např. HEAD, BODY, HREF, TABLE atd.).), aby se vám ukázala Hezká stránka.

webové aplikace pracují v architektuře klient-server – kde webový server hostuje obsah, ke kterému chcete přistupovat, a webový prohlížeč funguje jako klient.

Webová architektura klient-Server

co je testování funkčnosti?

jak název napovídá, při psaní funkčního testovacího kódu je vaším cílem otestovat funkčnost aplikace. Jinými slovy, chcete se ujistit, že aplikace dodržuje funkční specifikaci.

existují i jiné typy testů, jako jsou testy výkonu, bezpečnostní (penetrační) testy a testy přijatelnosti uživatelů.

funkční testovací kód, který napíšete, může být zahrnut do tzv. regresního testu, který je prováděn pravidelně, aby se zajistilo, že staré funkce nebudou porušeny kvůli novému vývoji.

na konci tohoto příspěvku pochopíte úplný kód uvedený níže.

nenechte se zklamat, pokud máte pocit, že je to příliš mnoho. Cílem tohoto příspěvku je pitvat to a ukázat vám, jak můžete pochopit tento kód a pak napsat svůj vlastní!

následující diagram ukazuje přístup na vysoké úrovni k automatickému testování webové aplikace (stránky).

kroky testování webových aplikací

abychom mohli psát naše testy, používáme testovací rámec nazvaný unittest. Je velmi podobný junit v Javě nebo nunit V .Net.

unittest umožňuje seskupit Inicializační kód do funkce nastavení a vyčistit kód tin a tearDown funkce.

následující diagram ukazuje celkový přístup za testováním jednotek.

jednotkový testovací rámec

jak můžete vidět z výše uvedeného diagramu, testovací sada se skládá z jednoho nebo více testovacích případů.

testovací případ může mít jeden nebo více testů. V tomto příspěvku se zaměříme na testovací případ s jedním testem. Na konci ukážeme, jak přidat další testy do stejného testovacího případu a vytvořit testovací sadu.

jak již bylo zmíněno dříve, každý testovací případ má metody setUp (run at the beginning) a tearDown (run at the end) pro provedení inicializace a vyčištění.

struktura testovacího případu jednotky

výše uvedený úryvek kódu ukazuje strukturu testovacího případu jednotky.

řádek 1: Importujte potřebné knihovny. V našem případě používáme knihovny selen a unittest.

řádek 3: vytvoříte třídu s názvem MyTestCase, která rozšiřuje unittest.Třída TestCase. Říkáme, že unittest.TestCase je nadřazená třída A MyTestCase je podřízená třída.

řádek 4: do metody nastavení přidáme náš Inicializační kód. Musíte použít přesný název metody, abyste unittest věděli, že sem přidáváte svůj Inicializační kód. Při spuštění tohoto testovacího případu se tato metoda provede jako první.

řádek 7: ukázkový test, který chceme zahrnout do testovacího případu.

řádek 10: Další ukázkový test, který máme v našem testovacím případě.

řádek 16: do této metody tearDown přidáme náš kód pro vyčištění. Opakem metody nastavení je metoda tearDown, která je provedena jako poslední.

takže pořadí vyvolání metody je:

nastavení > test1 > test2 > … > tearDown

řádek 20: Říká se, že hlavní program začíná z tohoto místa.

řádek 21: takto spustíte testovací případ.

nyní je čas, abychom dostali ruce na skutečný test, který jsme chtěli udělat. Odvolání, že chceme vyzkoušet, zda vyhledávací pole Google vrátí alespoň 5 výsledky pro dané klíčové slovo pro vyhledávání.

podívejme se nejprve na metodu nastavení:

v tomto úryvku kódu vytvoříme ovladač prohlížeče Chrome.

pokud jej ještě nemáte, musíte si stáhnout ovladač Selenium Chrome. Od tohoto psaní má Chrome také verzi 74. Protože můj prohlížeč Chrome je verze 73, Stáhl jsem si pro toto cvičení verzi 73.

Řádek 2 a 3 Vytvořte možnost Chrome a nechte selenium webdriver vědět, že nechceme, aby byl prohlížeč viditelný Při spuštění testu.

pokud tuto možnost nepřidáte, váš test se zasekne v místě, kde se otevře prohlížeč.

nyní se podívejme na metodu tearDown:

jednoduše vyčistíme ovladač voláním metody quit ().

konečně je čas podívat se na test, který chceme zahrnout do tohoto testovacího případu. Připomeňme, že můžeme testovat (tvrdit), pokud je počet vrácených výsledků vyhledávání větší nebo roven 5.

skutečný testovací kód

řádek 1: Zkušební metoda začíná slovem „test“.

řádek 3: zatížení www.google.com webová stránka do ovladače (Všimněte si, že já.ovladač je vytvořen během doby nastavení).

řádek 6: Vyhledejte vyhledávací pole podle názvu prvku HTML „q“. Chcete-li to zjistit, musíte zkontrolovat stránku HTML.

řádek 7: V případě, že existují nějaké výchozí hodnoty, vyprázdněte vyhledávací pole.

řádek 10: vyplňte vyhledávací pole vyhledávacím řetězcem „automatizované testování“.

řádek 11: odešlete vyhledávací dotaz společnosti Google.

řádek 14: XPath identifikace záhlaví výsledků vyhledávání.

řádek 17: počkejte 10 sekund, než se načte stránka s výsledky Google.

řádek 20: Získejte všechny nadpisy výsledků vyhledávání pomocí XPath definované v řádku 14.

řádky 25 a 26: Nadpisy výsledků vyhledávání jsou ve skutečnosti seznamem a iterujeme je k výstupu na obrazovku. Tyto dva řádky jsme přidali pouze pro demonstrační účely. Testovací skripty obvykle nemají tiskové obrazovky, protože není k dispozici nikdo, kdo by se díval na obrazovku, aby viděl takový výstup při automatizaci.

řádek 30: toto je skutečné tvrzení, které děláme. assertGreater je metoda definovaná v unittest.Třída TestCase, která nám umožňuje zkontrolovat, zda je nějaký výstup větší než nějaká hodnota.

unittest.TestCase nám ve skutečnosti poskytuje sadu takových metod pro kontrolu rovnosti, větší než, menší než atd. v závislosti na tom, co chcete tvrdit. Následující graf ukazuje některé z běžných dostupných metod assert.

běžné metody Assert v unittest.TestCase

jak je uvedeno na začátku, můžete napsat testovací případ vyvoláním následujícího kódu:

unittest.main()

do příkazového řádku můžete jednoduše zadat název souboru, který jste použili k uložení testovacího případu.

python google_search_test.py

spustí setUp(), pak test_result_count() a nakonec tearDown().

měli byste vidět výstup podobný následujícímu:

výstup spuštění testovacího případu

pokud některý test selže, zobrazí se Zpráva o selhání spolu s testovací metodou, která selhala.

to je váš první úspěšný selen / unittest testovací případ. Gratuluji! Je to důležitý milník.

Bonus

pokud máte páru, doporučuji vám, abyste následovali zbytek, abyste se dostali ještě hlouběji do automatizovaného testování webové aplikace Selenium/unittest.

řekněme, že chcete otestovat, zda se Nadpis rovná „Google“.

testovací kód vypadá následovně:

def test_header(self):
self.driver.get("http://www.google.com")
self.assertEqual("Google", self.driver.title)

nyní celý náš testovací případ vypadá následovně:

class GoogleSearchTest(unittest.TestCase):
def setUp(self): def test_header(self): def test_result_count(self): def tearDown(self):
if __name__ == "__main__":
unittest.main()

předpokládejme, že výše uvedené tiskové obrazovky jsou komentovány. Při spuštění aktualizovaného testovacího případu byste měli získat výstup následujícím způsobem:

test_header (__main__.GoogleSearchTest) ... ok
test_result_count (__main__.GoogleSearchTest) ... ok----------------------------------------------------------------------
Ran 2 tests in 13.799s
OK

říká se, že provedla dva testy a oba jsou úspěšné.

řekněme, že změním assertEqual podmínku v prvním testu na následující:

self.assertEqual("Microsoft", self.driver.title)

Co myslíš, že by se tady stalo?

ano, uhodli jste to správně. První testovací případ selže jako já.ovladač.titul se rovná Googlu, ne Microsoftu.

získáte výstup podobný následujícímu:

test_header (__main__.GoogleSearchTest) ... FAIL
test_result_count (__main__.GoogleSearchTest) ... ok
====================================================================
FAIL: test_header (__main__.GoogleSearchTest)
--------------------------------------------------------------------
Traceback (most recent call last):
File "google_search_test.py", line 19, in test_header
self.assertEqual("Microsoft", self.driver.title)
AssertionError: 'Microsoft' != 'Google'
- Microsoft
+ Google
--------------------------------------------------------------------
Ran 2 tests in 14.011s
FAILED (failures=1)

výše uvedený výstup říká, že pouze jeden test byl úspěšný a neúspěšný.

při prvním psaní testovacích případů se můžete setkat s takovými situacemi.

za předpokladu, že váš testovací případ je správný, identifikujete chyby v kódu a dostanete příslušné vývojáře, aby problém vyřešili a znovu otestovali.

pokud k této chybě dojde v regresním testu, je tato chyba zavedena kvůli novému vývoji softwaru provedenému nad stávající kódovou základnou.

to ukazuje, že je něco špatně s novou kódovou základnou, kterou je třeba opravit, aby se ujistil, že stará funkce funguje. Vývojáři se o to opět musí postarat.

co takhle mít mnoho testovacích případů? Řekněme, že máme TestCase1 a TestCase2, přičemž každý má několik testů.

můžete vytvořit takzvanou testovací sadu a spustit ji pomocí testovacího běžce následujícím způsobem:

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestCase1))
suite.addTest(unittest.makeSuite(TestCase2))
runner = unittest.TextTestRunner()
runner.run(suite)

výše uvedený kód spustí všechny testy v TestCase1 a poté v TestCase2.

to je pro dnešek vše. Doufám, že to pomůže.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.