Mam moduł Python, który używa biblioteki argparse. Jak napisać testy dla tej części bazy kodu?Jak pisać testy dla części argarse modułu python?
Odpowiedz
Należy byłaby kod i przenieść parsowania do funkcji:
def parse_args(args):
parser = argparse.ArgumentParser(...)
parser.add_argument...
# ...Create your parser as you like...
return parser.parse_args(args)
Następnie w funkcji main
należy właśnie nazywamy go:
parser = parse_args(sys.argv[1:])
(gdzie pierwszy element z sys.argv
, który reprezentuje nazwę skryptu, został usunięty, aby nie wysyłać go jako dodatkowego przełącznika podczas działania interfejsu CLI.)
W swoich badaniach, można następnie wywołać funkcję parsera ze cokolwiek lista argumentów chcesz przetestować go z:
def test_parser(self):
parser = parse_args(['-l', '-m'])
self.assertTrue(parser.long)
# ...and so on.
W ten sposób nigdy nie będziesz musiał wykonać kod aplikacji tylko do testowania parser.
Jeśli trzeba zmienić i/lub dodać opcje do parsera później w aplikacji, a następnie utworzyć metody fabryki:
def create_parser():
parser = argparse.ArgumentParser(...)
parser.add_argument...
# ...Create your parser as you like...
return parser
można później manipulować, jeśli chcesz, a test mógłby wyglądać :
class ParserTest(unittest.TestCase):
def setUp(self):
self.parser = create_parser()
def test_something(self):
parsed = self.parser.parse_args(['--something', 'test'])
self.assertEqual(parsed.something, 'test')
Dzięki za odpowiedź. W jaki sposób testujemy błędy, gdy dany argument nie jest przekazywany? –
@PratikKhadloya Jeśli argument jest wymagany i nie jest przekazywany, argparse zgłosi wyjątek. –
Dobrze, ale próbuję również przetestować komunikat w wyjątku. Nie mogę uzyskać blokady komunikatu w obiekcie wyjątku. https://gist.github.com/tispratik/aebff28b8c5afd7bee59 –
- Wypełnianie listy arg za pomocą
sys.argv.append()
a następnie zadzwonićparse()
, sprawdzić wyniki i powtórzyć. - Wywołanie z pliku wsadowego/bash z flagami i flagą dump args.
- Połóż całą analizę argumentów w oddzielnym pliku, a następnie przetwórz i zrzuć/oceń wyniki, a następnie przetestuj to z pliku wsadowego/bash.
prosty sposób testowania parser:
parser = ...
parser.add_argument('-a',type=int)
...
argv = '-a 1 foo'.split() # or ['-a','1','foo']
args = parser.parse_args(argv)
assert(args.a == 1)
...
Innym sposobem jest modyfikować sys.argv
i wywołać args = parser.parse_args()
Istnieje wiele przykładów testów argparse
w lib/test/test_argparse.py
Dodać funkcja main()
wziąć argv
jako argument zamiast pozwolić mu read from sys.argv
as it will by default:
# mymodule.py
import argparse
import sys
def main(args):
parser = argparse.ArgumentParser()
parser.add_argument('-a')
process(**vars(parser.parse_args(args)))
return 0
def process(a=None):
pass
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Następnie można przetestować normalnie.
import mock
from mymodule import main
@mock.patch('mymodule.process')
def test_main(process):
main([])
process.assert_call_once_with(a=None)
@mock.patch('foo.process')
def test_main_a(process):
main(['-a', '1'])
process.assert_call_once_with(a='1')
Okazało się, że najprostszym sposobem, przynajmniej dla mnie, po prostu by sprawdzić sys.argv [0] więc sprawdzić, czy pyton został prowadził jako python -m unittest
i nic nie analizować, czy to był przypadek.
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--outdir', help='Directory to output to', \
default='out')
parser.add_argument('--file', help='Input file', \
default='section')
parser.add_argument('--word', help='Word to look up')
if sys.argv[0] == 'python -m unittest':
args = parser.parse_args([])
else:
args = parser.parse_args()
„argparse część” jest nieco niejasne, więc ta odpowiedź skupia się na jednej części: metoda parse_args
.Jest to metoda, która współdziała z linią poleceń i pobiera wszystkie przekazane wartości. Zasadniczo możesz wyśmiewać to, co zwraca parse_args
, aby nie było potrzeby pobierania wartości z wiersza poleceń.
import argparse
import mock
@mock.patch('argparse.ArgumentParser.parse_args',
return_value=argparse.Namespace(kwarg1=value, kwarg2=value))
def test_command(mock_args):
pass
Trzeba uwzględnić wszystkie args metoda dowodzenia w Namespace
nawet jeśli nie są one przekazywane. Podaj te argumenty o wartości None
. (patrz: docs) Ten styl jest przydatny do szybkiego wykonywania testów w przypadkach, w których dla każdego argumentu metody przekazywane są różne wartości. Jeśli zdecydujesz się na kpiny z samego siebie, aby całkowicie polegać na argumencie w swoich testach, upewnij się, że zachowuje się podobnie do rzeczywistej klasy Namespace
.
Ale teraz twój najbardziej niepoprawny kod zależy również od "argparse" i klasy "Namespace". Powinieneś kpić z 'Namespace'. –
@DrunkenMaster przeprasza za złośliwy ton. Zaktualizowałem swoją odpowiedź z wyjaśnieniem i możliwymi zastosowaniami. Uczę się tutaj również, więc jeśli możesz, możesz (lub ktoś inny) dostarczyć przypadki, w których kpina z wartości zwrotu jest korzystna? (a przynajmniej przypadki, w których * nie * kpiny z wartości zwracanej są szkodliwe) –
- 1. Jak pisać testy dla dekoratora kontrolera spree?
- 2. Jak pisać testy dla mojej aplikacji internetowej?
- 3. Jak pisać testy jednostkowe w PHP?
- 4. Testy modułu obsługi Netty SSL
- 5. Czy mogę pisać testy dotyczące nieprawidłowych wcieleń?
- 6. Jak skonsolidować testy modułu ZF2/modułu aplikacji w jednym wywołaniu?
- 7. jak pisać oczekiwane awarie?
- 8. Jak pisać sterowniki dla Androida?
- 9. Jak zmienić nazwę modułu Python?
- 10. Testy selenu dla niestandardowych portletów
- 11. Jak nie pisać pełnej ścieżki modułu w ruby?
- 12. Instalowanie modułu Twitter Python
- 13. Python nosetests pomiń niektóre testy
- 14. Testy pisania dla działań administracyjnych Django
- 15. Jak wydrukować dokumentację modułu w języku Python
- 16. Paramaterize testy jednostkowe w python
- 17. Jak pisać funkcje asynchroniczne dla Node.js
- 18. Jak automatyzować testy aktualizacji dla Androida
- 19. Python: Dokładne wskazanie liniowej części stoku
- 20. Python. - Najlepszy Moduł pisać do plików XLS
- 21. Kompilowanie sterownika jako części jądra, a nie jako modułu
- 22. Jak mogę utworzyć kompleksowe testy dla aplikacji Mac (Cocoa)?
- 23. Jak przeprowadzić testy dla konkretnego modułu w ramach projektu w Jenkins przez narzędzie maven?
- 24. poprawa szybkości importu modułu Python
- 25. Wywołanie modułu Perla z Python
- 26. Jak symulować żądanie wpisu HTTP za pomocą modułu zapytań Python?
- 27. Testy integracyjne dla fullCalendar
- 28. Testy SQLCop dla tSQLt
- 29. Jak pisać GUI w Pythonie?
- 30. Jak pisać dane binarne w stdout w python 3?
Nie jestem pewien, jak to powiedzieć bez natknięcia się na szarpnięcia, ale w jaki sposób pomaga mi połączenie z czymś, nawet bez słowa "test"? – pydanny
argparse to interfejs linii poleceń. Napisz testy, aby wywołać aplikację za pomocą wiersza poleceń. – Homer6