Hej,
Mam taki ‘kejs’.
Testy piszę w python +unittest +selenium.
Swoje testy puszczam z cmd przy pomocy komendy ‘python -m unittest scripts.py’. Wszystko jest OK 🙂
Jednak w tej komendzie chciałabym podać również na jakim środowisku testy mają się odpalić, chodzi mi o sytuację, gdy w teście mam zdefiniowany URL do produkcji i do środowiska testowego i wpisując w komendzie np ‘env=prod’ test odpala się na URL produkcyjnym, a w sytuacji gdy podaję ‘env=środowiskoTestowe ‘ testy odpalają się na URL testowego środowiska.
Przekopałam trochę internet i jedyne co znalazłam to biblioteka argpars, jednak to też mi nie pomogło. Czy dla python +unittest +selenium da się w ogóle coś takiego zrobić ? W taki sam sposób chciałabym wskazywać na jakiej przeglądarce testy mają się odpalać i mam ten samym problem.
Jakieś rozwiązanie dla takiego problemu lub jakaś podpwiedź ? 🙂
Pozdrawiam !
Hej,
Generalnie problem jest w tym, że wszystkie argumenty będą zgarniane przez bibliotekę unittest i nie ma prostej odp. Najlepiej jest użyć ustawień w zmiennych środowiskowych lub przechowywanych w pliku, co jest najlepszym multisystemowym rozwiązaniem 🙂
Przykład 1.
Z zapisem do pliku – stwórzmy pythonowy plik env_set.py
from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-e", "--environment", help="specify type of environment: test, dev, prod") args = parser.parse_args() ENV = '' received_env = str(args.environment) test_env = 'http://lolo-test.com' dev_env = 'http://lolo-dev.com' prod_env = 'http://lolo-prod.com' if received_env: if received_env == 'test': ENV = test_env elif received_env == 'dev': ENV = dev_env elif received_env == 'prod': ENV = prod_env else: print(f'There is no environment like: {received_env}, setting up default test env: {test_env}') ENV = test_env else: print(f'No environment specified, setting up default test env: {test_env}') ENV = test_env with open('env.txt', 'w+') as file: file.write(ENV) print('saved')
i w samym teście np plik test_login.py
import unittest class TestLogin(unittest.TestCase): ENV = '' def setUp(self): with open('env.txt') as f: ENV = f.readlines() self.base_url = ENV def test_logins_or_something(self): print(self.base_url)
Wywołanie
python env_set.py -e 'test' | python -m unittest test_login.py
Gdzie pierwszą część można wywołać tylko raz przed testem. To jest w mega uproszczeniu – dalej trzeba zaczytywanie z pliku URL dać do osobnej metody i już w każdym setUp
wołać tą metodę.
Przykład 2.
Najprościej zrezygnować z używania unittest i odpalać bezpośrednio plik jak: python myTest.py
wtedy możemy użyć dowolnych argumentów ale musimy uruchomić unittest
w naszym odpalanym pliku.
import sys import unittest def env_set(environment): test_env = 'http://lolo-test.com' dev_env = 'http://lolo-dev.com' prod_env = 'http://lolo-prod.com' if environment: if environment == 'test': return test_env elif environment == 'dev': return dev_env elif environment == 'prod': return prod_env else: print(f'There is no environment like: {environment}, setting up default test env: {test_env}') return test_env else: print(f'No environment specified, setting up default test env: {test_env}') return test_env class TestLogin(unittest.TestCase): ENV = '' def setUp(self): self.base_url = env_set(self.ENV) def test_logins_or_something(self): print(self.base_url) if __name__ == "__main__": if len(sys.argv) > 1: TestLogin.ENV = sys.argv.pop() unittest.main()
Wywołując python testLogin test
lub z innym argumentem otrzymasz odpowiednie środowisko. idąc dalej możesz w ten sam sposób użyć zaawansowanej parametryzacji.
Przykład 3.
Inny działający przykład przekazywania parametrów bezpośrednio do testów:
from argparse import ArgumentParser import unittest class TestingClass(unittest.TestCase): def test_on_my_custom_env(self): print(f"My env is: {args.env}") parser = ArgumentParser() parser.add_argument("-e", "--env", dest="env", help="Environment") args = parser.parse_args() if __name__ == "__main__": runner = unittest.TextTestRunner() my_test_class = unittest.TestLoader().loadTestsFromTestCase(TestingClass) runner.run(my_test_class)
Teraz, jeśli użyjemy komendy:
python unittest_sample.py --env prod
otrzymamy:
usage: unittest_sample.py [-h] [-e ENV] unittest_sample.py: error: unrecognized arguments: prod C:\projects\scripts>python unittest_sample.py --env prod My env is: prod . ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
ArgumentParser – jest to chyba najwygodniejszy sposób przekazywania i parsowani parametrów 😉 Nietrywialne może się wydawać wywołanie klasy testowej – nie można tutaj użyć unittest.main()
, gdyż powoduje to wyświetlenie błędu o nierozpoznanych parametrach: unittest_sample.py: error: unrecognized arguments: --env
. Może być to spowodowane faktem, że unittest.main()
próbuje parsować wszystkie, w tym nasze, parametry i ich po prostu nie rozpoznaje.