Ćwiczenie BDD w Pythonie [zamknięte]

133

Jakie są najbardziej zaawansowane frameworki i narzędzia dostępne dla Pythona do ćwiczenia rozwoju opartego na zachowaniu? Szczególnie znalezienie podobnych narzędzi, jak rspec i mocha dla ruby, byłoby świetne.

JtR
źródło
1
Flowp „pozwala na pisanie testów w stylu RSpec BDD z minimalną ilością magii”.
Carl G
7
Tylko na SO bycie wysoce informacyjnym oznacza „nie konstruktywne”.
jeremyjjbrown

Odpowiedzi:

38

Ian Bicking zaleca używanie doctest do projektowania opartego na zachowaniu:

Osobiście używam makiety nosa i voidspace w stylu projektowania opartego na zachowaniu. W szczególności wtyczka specyfikacji dla nosa jest doskonała dla BDD.

Ryan
źródło
7
Andrew Bennetts niedawno napisał kilka postów o tym, dlaczego jego zdaniem doctest jest nadużywany. andrew.puzzling.org/diary/2008/October/23/narrative-tests andrew.puzzling.org/diary/2008/October/24/more-doctest-problems
ddaa
4
Myślę, że doctest w rzeczywistości jest bardziej zgodny z filozofią BDD, kiedy traktujesz go tak, jak był przeznaczony: zaczynasz pisać o oprogramowaniu, a następnie przeplatasz to z przykładami, które również tworzą testy. Jest również opisywany jako „rozwój oparty na dokumentach” - chodzi o skupienie się na zewnętrznej, opisywalnej funkcjonalności, a nie na wewnętrznych jednostkach pracy. Myślę, że tradycja xUnit jest w tym okropna.
ianb
48

Sałata znaczy być narzędziem podobnym do ogórka dla Pythona: http://lettuce.it/

Możesz pobrać źródło na github.com/gabrielfalcao/lettuce

user333958
źródło
Użytkownicy systemu Windows rozważający sałatę powinni wiedzieć w chwili pisania tego tekstu, że obsługa tego systemu operacyjnego nie jest prosta.
leonigmig
7
Każdy użytkownik zamierzający używać sałaty z django powinien być świadomy, że domyślnie używa on twojej domyślnej bazy danych do testów. Ten interesujący projekt kosztował mnie jedną produkcyjną bazę danych :(
Rachel
3
Istnieją również alternatywy dla sałaty, takie jak Behave; Oto post na blogu, w którym porównuje się je i opowiada się za zachowaniem .
driftcatcher
1
Dzięki @seafangs - Zachowanie wygląda na łatwiejsze w zarządzaniu w przypadku dużych projektów niż sałata.
jamesc
Jeśli używasz django, zaoszczędź trochę czasu na używaniu Lettuce, obecna wersja 2.19 nie działa z najnowszym django.
James Lin
46

Naprawdę polecam zachowanie .

Szukając klonu Cucumber dla Pythona, zacząłem używać sałaty, ale okazało się, że jest to dość niezdarnie zaprojektowana replika. Bardzo Unpythonic.

Wtedy odkryłem, jak zachowuję się i byłem z tego naprawdę zadowolony.

Towarzyski
źródło
11
Przerzuciłem się na zachowanie sałaty, gdy jej domyślne zachowanie polegające na używaniu domyślnej bazy danych do testowania w projekcie django kosztowało mnie produkcyjną bazę danych na serwerze na żywo :( Naprawdę lubię się zachowywać; zacząłem projekt django-behave, aby go podłączyć Framework testowy django github.com/rwillmer/django-behave
Rachel
1
Czuję twój ból, cieszę się również, że twoje cierpienie przyczyniło się do rozkwitu ekosystemu django. ;-)
John Wang
1
Czy mogę używać behave bez plików funkcji? Nie mam użytkowników nietechnicznych, więc pisanie ich jest dla mnie tylko hałasem. Jeśli ktoś nie może przeczytać moich podanych / kiedy / wtedy testów, nie ma w tym żadnego interesu.
jeremyjjbrown
29

Polecam skorzystać z zestawu narzędzi opracowanych, aby pomóc programistom w praktyce BDD i TDD. Ten zestaw narzędzi składa się z: pycukes , specloud , ludibrio i should-dsl .

Powinien DSL da ci oczekiwania podobne do RSpec. Wszystko, co możesz zrobić z RSpec Expectation API, robi też should-dsl. Możesz pobrać najnowszą wersję z Github .

SpecLoud pomaga w uruchamianiu unittestów podobnych do BDD. Możesz go zainstalować, wykonując

pip install specloud

Ludibrio to biblioteka do testowych gier podwójnych (Mocks, Stubs i Dummies). Zainstaluj go przez

pip install ludibrio

I PyCukes jest głównym narzędziem BDD. Będzie uruchamiać scenariusze itp. Ponownie,

pip install pycukes

Aby uzyskać więcej informacji, przeczytaj dokumentację narzędzi w PyPi .

Douglas Camata
źródło
Znalazłem ten przydatny dokument podczas szukania szczegółów Twojej odpowiedzi: arxiv.org/pdf/1007.1722
amit
Lubię powinien-dsl. Rozważałem DSL dla pythona BDD - jest ich kilka, ten wydaje się dość wyrazisty.
Danny Staple
Nie mogę znaleźć żadnych informacji o frameworku BDD o nazwie Pyramid. Odnośnik, do którego odwołuje się artykuł, do którego prowadzi @phaedrus, prowadzi do podejrzanie wyglądającej witryny, która nie ma nic wspólnego z testowaniem, a wyszukiwanie w Google wskazuje na Pyramid , strukturę sieciową. Czy każdy może podać aktualny link?
Björn Pollex
1
Wolę pewny DSL asercji.
fatuhoku
@ BjörnPollex, nazwa Pyramid nie mogła być używana przez twórców tych narzędzi z powodu Pyramid Web Framework. Teraz to tylko oddzielne narzędzia.
Douglas Camata
11

Świetny post i odpowiedzi. Chciałem tylko zaktualizować, aby uwzględnić Odświeżenie na tej liście, ponieważ przeczytałem, że pycukes zostało wycofane. Dobry post o używaniu BDD i Django z Freshen jest tutaj .

Steve
źródło
9

Możesz użyć „sure” do wyrażania asercji (tak jak w RSpec)

Gabriel Falcão
źródło
Parabeny! Całkowicie zaskoczyłeś mnie kodem w magic.py. Nie miałem pojęcia, że ​​w Pythonie możliwe są „metody rozszerzające” (klasy otwarte).
mdwhatcott
8

Projekt Pyccuracy to próba dostarczenia specyficznego dla domeny języka dla BDD w Pythonie.

W przeciwieństwie do doctest, który działa na poziomie API, koduje operacje wyższego poziomu, takie jak ładowanie strony internetowej i wysyłanie formularza. Nie używałem tego, ale wygląda nieco obiecująco, jeśli tego właśnie szukasz.


źródło
6

Bardzo lubię Pyccuracy . Obecnie wdrażam go w średniej wielkości projekcie.

Refael Ackermann
źródło
3
Byłbym zainteresowany każdym niedawnym porównaniem Pyccuracy vs Sałata, którym ktoś mógłby się podzielić.
michela
Być może w porównaniu uwzględnij także odświeżanie (link w odpowiedzi powyżej).
rano
Już zadawane tutaj: quora.com/...
Amit
6

Wypróbuj Pyspecs . Uczynienie testów łatwymi do odczytania i ciągłe uruchamianie podczas programowania było dwoma z moich głównych celów podczas tworzenia tego projektu.

Kod testu:

from pyspecs import given, when, then, and_, the, this

with given.two_operands:
    a = 2
    b = 3

    with when.supplied_to_the_add_function:
        total = a + b

        with then.the_total_should_be_mathmatically_correct:
            the(total).should.equal(5)

        with and_.the_total_should_be_greater_than_either_operand:
            the(total).should.be_greater_than(a)
            the(total).should.be_greater_than(b)

    with when.supplied_to_the_subtract_function:
        difference = b - a

        with then.the_difference_should_be_mathmatically_correct:
            the(difference).should.equal(1)

Wyjście konsoli:

# run_pyspecs.py

  |  given two operands 
  |    when supplied to the add function 
  |      then the total should be mathmatically correct 
  |      and the total should be greater than either operand 
  |    when supplied to the subtract function 
  |      then the difference should be mathmatically correct 

(ok) 6 passed (6 steps, 1 scenarios in 0.0002 seconds)
mdwhatcott
źródło
4

Ja prawdopodobnie całkowicie brakuje punktu, ale co mam zachowane w oryginalnym papierze BDD , że BDD właśnie TDD przepakowane podkreślić pewne najlepszych praktyk.

Jeśli moja interpretacja jest poprawna, możesz uzyskać framework BDD po ​​prostu zmieniając nazwy metod w dowolnej implementacji xUnit . Więc po prostu idź dalej i użyj standardowej biblioteki unittest .

EDYCJA: Szybki Google włączył moduł Zachowania w Cheese Shop . Dalsze poszukiwania BDD tam nie znalazły nic innego.

ddaa
źródło
TDD to naprawdę rewolucjonizująca praktyka w zupełnie innej skali niż BDD. Wciąż doceniam sposób pisania testów w stylu BDD.
JtR,
1
BDD rozpoczął się na poziomie jednostki, to prawda. Rozwinął się dość szybko, obejmując zachowanie na poziomie systemu, w którym konteksty, zdarzenia i wyniki korzystają z nieco większej możliwości ponownego wykorzystania - stąd mnożenie się narzędzi obsługujących zarówno to, jak i scenariusze w języku naturalnym uchwycone podczas rozmów z nietechnicznymi interesariuszami. Odkąd zadano to pytanie, przenieśliśmy BDD na poziom wizji projektu, używając funkcji Feature Injection, z takim samym naciskiem na odkrywanie poprzez konwersację i język domeny. Wciąż nic nowego pod słońcem.
Lunivore
Podoba mi się ta rozmowa o bdd youtube.com/watch?v=pherUEzdJow . Pokazuję dobry sposób pisania specyfikacji i testowania.
aisbaa