WebHU - Programozási kérdések és válaszok

Python egységteszt teljes modul beállítása

Megpróbálok tesztelni egy webalkalmazást Selenium és Python segítségével. Az alkalmazásnak van egy adatbázis-mentési segédprogramja, amely nagyon praktikus. Jelenleg egy nagy osztályom van RegressionTest(unittest.TestCase), és ez a setUpClass() és tearDownClass() osztályokat használja az adatbázis biztonsági mentésének végrehajtásához a teszt befejezése előtt és a visszaállításhoz. Minden remekül működik, de nagyon szeretném ezeket a teszteket több osztályra felosztani (mindegyik tesztosztálynak saját fájlja van), de nem találok erre megfelelő módot a biztonsági másolat megkettőzése nélkül. /restore művelet.

Tovább bonyolítja a dolgokat, a következő korlátozásokkal szeretném kiegészíteni:

Ezt mind a TeamCity CI-szerveremen (jelenleg python3 -m teamcity.unittestpy-t használom, de rugalmas vagyok, amíg továbbra is kapok tesztjelentéseket) és a PyCharm szabványos egységteszt-konfigurációján keresztül is meg kell hívni. Sajnos, amikor a PyCharmon keresztül hívják meg, úgy tűnik, hogy az '__main__' == __name__ értéke False, ami kizárja egy ehhez hasonló környezetkezelő lehetőségét:

if '__main__' == __name__:
  with BackupManager():
    if seleniumutils.is_running_under_teamcity():
      runner = TeamcityTestRunner()
    else:
      runner = unittest.TextTestRunner()
    unittest.main(testRunner=runner)

Íme a PyCharm által végrehajtott sor: /usr/bin/python3 /Path/To/PyCharm/Installation/helpers/pycharm/_jb_unittest_runner.py --path /Path/To/Project/Test/Code/testregression.py És itt van a _jb_unittest_runner.py pontos verziója a PyCharm jelenleg használt verziójában: https://github.com/JetBrains/intellij-community/blob/3486b93168677dbc2519a78f472039bc50ca78be/python/helpers/pycharm/_jb_unittest_runner.py

Nem jut eszembe semmi, ami lehetővé tenné, hogy ezt megtegyem. Azt hittem, talán a többszörös öröklődés segíthet, bármilyen csúnya is legyen az. De nem tudok olyan forgatókönyvet kitalálni a fejemben, amely ne hagyná, hogy minden tesztet legalább kétszer meghívjanak.

Szóval, tud valaki olyan megoldást találni, amely lehetővé teszi, hogy pontosan egyszer hajtsak végre egy műveletet a tesztek előtt és után?


  • Gondolt már arra, hogy ahelyett, hogy a futó fejlesztői adatbázisával vacakolna, a tesztjeit egy másik adatbázisra irányítja (egy memóriában lévő sqlite-re, egy másik sémára a fejlesztői adatbázisban, vagy akár egy második docker-tárolóra, amelyet a tesztszkript felpörget?) 15.03.2018
  • Tetszik az ötleted, de ez megváltoztatná az egész tesztelési módot, és nagyon lelassítaná a teszt-kód-ismétlés ciklust. Természetesen leírhatnám néhány lépést, de ez további összetettséget ad, amelyet inkább elkerülnék. Mivel ezek szeléntesztek, nem egyszerű módja annak, hogy egy futó alkalmazáspéldányt lecseréljünk egy másik adatbázisra. 16.03.2018

Válaszok:


1

Ha tesztmodulonként egyszer szeretné futtatni az adatbázis biztonsági mentését, akkor fontolóra veheti a setUpModule() és tearDownModule() függvényeket.

A Python unittest modulonként egyszer hajtja végre a setUpModule() és tearDownModule() függvényeket, ha ezek modulszinten vannak deklarálva.

A PyCharm ezeket fogja futtatni, ha a unittestrunnerrel van konfigurálva, és szerintem a TeamCity is fog futni, mivel a unittest-t használja a borító alatt.

15.03.2018
  • Azt hiszem, pontosan ezt keresem, de nem tudom, mi határozza meg egyetlen modul határát. Meg tudod ezt magyarázni? 15.03.2018
  • A határ itt a tesztosztályokat tartalmazó .py fájl lenne. Tehát ha azt tervezi, hogy a nagy tesztosztályt külön modulokba (.py fájlokba) kívánja átalakítani, az azt jelenti, hogy mindegyikben különsetUpModule() és tearDownModule() függvényeket kell meghatározni. 15.03.2018
  • Ez egy igazi balhé, és azt jelenti, hogy alig jobb, mint a setUpClass() és a tearDownClass() használata. Látom, a kérdésemben nem szerepelt kifejezetten az a vágyam, hogy fájlonként egy tesztosztály legyen, ezért szerkesztem. 15.03.2018
  • A tesztkönyvtárban lévő init.py fájlba helyezheti, és csomagonként egyszer futtathatja is. 15.03.2018
  • Most EZ úgy hangzik, mint amit keresek. Átalakítod ezt válaszlá, és linket tudsz adni a dokumentumokhoz? 16.03.2018
  • Nem találok hivatkozást a init.py-re, és különösen a init.py-ra, a unittest-ra vonatkozóan. __init__.py-re gondolsz? Ha igen, az nem adná vissza a funkcionalitást, igaz? 16.03.2018
  • A dokumentumokban sem látok erre utalást, de az in it.py fájlokban igen. Lehetséges, hogy ez orrvizsgálat specifikus dolog, ezért csak azt javaslom, hogy próbálják ki. (Igen, az aláhúzás a fájlnévben dőlt betűvé vált) 23.03.2018
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..