2012-10-19 12 views
12

Jak mogę debugować moje testy? Na przykład: POST, aby utworzyć wpis i oczekiwać, że zweryfikuje i zwróci daną stronę. Działa w przeglądarce i powłoce, ale test jest jedyną rzeczą, która zawodzi (ironicznie!). Chciałbym wydrukować odpowiedź na konsolę lub coś takiego, abym mógł odczytać błędy lub co ty. Ale widzę tylko rzeczy, które I print w np. widok.Jak debugować awarie testów w Django?

Nie wiesz, że to konieczne, ale tutaj jest kod testu w pytaniu od tests.py:

resp = self.client.post('/meal/invite/', 
     {'summary': 'Test munch', 'when': now(), 'max_diners': '1', 'description': 'Munchies'}, follow=True) 
    self.assertEqual(resp.status_code, 200) 
    self.assertContains(resp, 'Test munch', 1) 
    self.assertContains(resp, 'You are hosting this meal', 1) 

Ostateczna twierdzenie jest błędne. Jeśli zmienię go na wartość obecną na pierwotnej stronie formularza, która zawiera błędy wymagane w polu, oznacza to, że minęło. Po prostu nie widzę tego, czego mi brakuje.

Mam kilka innych testów działających, ale po prostu nie wiem, jak to debugować.

Jak to zrobić?

Odpowiedz

8

Możesz wrzucić pdb i sprawdzić wszystko.

Jeśli używasz nose wierzę trzeba uruchomić swoje testy z -s

-s, --nocapture  Don't capture stdout (any stdout output will be 
         printed immediately) [NOSE_NOCAPTURE] 

To co trzyma cię od razu widząc wyjścia.

+0

Tak, to było bardzo pomocne dla mnie! Mimo że dodałem punkty przerwania za pośrednictwem ('import ipdb; ipdb.set_trace()'), moje polecenie './manage.py test' nie zatrzymało się na punktach przerwania. Dodanie tej flagi '-s' naprawi to. – modulitos

3

Najprostszą rzeczą do zrobienia jest dodanie print response.content przed asercją. Dane wyjściowe mogą być trochę przytłaczające, ale często wystarczają, aby wykryć problem.

Jeśli to nie rozwiąże problemu, w dokumentacji jest wiele funkcji, które mogą pomóc. Dodaj kilka instrukcji drukowania i zobacz, co otrzymasz. Oto kilka sugestii, ale nie ograniczaj się do nich, w dokumentach jest więcej narzędzi.

https://docs.djangoproject.com/en/dev/topics/testing/

Najpierw trzeba sprawdzić, czy strona jest faktycznie przekierowanie jak można się spodziewać. Spróbuj użyć redirect_chain lub assertRedirects.

Podejrzewam, że twoje dane pocztowe nie są ważne z jakiegoś powodu. Możesz pobrać formularz z kontekstu odpowiedzi.

form = response.context['form'] 
print form.is_valid() 
print form.errors 
+1

Mogę wydrukować zawartość odpowiedzi, ale nie wiem, gdzie przekierowano standardowe wyjście podczas uruchamiania testów Django, więc nie mogę go wyświetlić. – jameshfisher

9

Aby uruchomić test pod WPB:

python -m pdb manage.py test yourapp 

zgadzam się z Alasdair The response.content druku (druk i rzeczy w ogóle) jest bardzo pomocne. Dane wyjściowe zostaną pomieszane z normalnym wynikiem testu biegacza i powinny zostać usunięte po znalezieniu problemu i naprawieniu go, ale może pomóc w zawężeniu problemu.

Ponadto, jeśli kod działa w przeglądarce i powłoce, ale nie w jednostce testowej, należy pamiętać, że test jednostkowy tworzy nową (pustą) bazę danych. Upewnij się, że setUp umieścił wszystkie dane wymagane do testu.

(Aktualizacja część kodu z Patryka sugestii, dzięki Patrick)

+0

Uwaga: Powinno to prawdopodobnie wyglądać tak: 'python -m pdb manage.py przetestuj twoją aplikację' – Patrick

Powiązane problemy