Jak zacząć na TDD z Ruby on Rails? [Zamknięte]

167

Znam te koncepcje (brałem udział w zajęciach testowych na studiach), ale nie jestem jeszcze pewien, jak z nich korzystać, ponieważ nigdy nie pracowałem nad „prawdziwym” projektem TDD.

Mam zamiar rozpocząć tworzenie projektu przy użyciu Ruby on Rails (najprawdopodobniej przy użyciu 2.3). Ta aplikacja będzie używana do zarządzania danymi, użytkownikami i niektórymi plikami. Na początku nie będzie to zbyt skomplikowane, ale może się znacznie skalować w ciągu najbliższych 6 miesięcy, więc uważam, że to właściwy czas, aby bardziej zaangażować się w TDD.

Mam podstawowy pomysł, jak to zrobić, ale nadal potrzebuję kilku wskazówek i porad:

  • Jaki artykuł Ruby on Rails TDD 101 powinienem przeczytać?

  • Co muszę przetestować?

  • Jakiego klejnotu / wtyczki powinienem użyć?

  • Czy powinienem używać rspec ? Coś innego?

  • Kiedy już mam wszystkie moje zajęcia testowe, jak je wdrożyć? (np .: Ciągła integracja)

  • Jak bardzo czasochłonne jest TDD?

  • Czy muszę przeczytać książkę na ten temat, czy też mogę uzyskać wszystko, bawiąc się nią i czytając samouczki online? Jeśli muszę przeczytać książkę, jaką książkę?


Lubię uczyć się na przykładach, więc czy ktoś mógłby mi powiedzieć, jak bym poszedł i obrał podejście TDD, aby rozwiązać ten problem:

Mam firmy. Mam kontakty. Kontakt można powiązać z 1 firmą. Firma może mieć wiele kontaktów. Chcę tworzyć sposoby tworzenia kontaktów, firm i łączyć kontakty z firmami.

Nie musisz używać tego przykładu w swojej odpowiedzi, ale to by pomogło :)

marcgg
źródło

Odpowiedzi:

202

Jaki artykuł Ruby on Rails TDD 101 powinienem przeczytać?

Zacznę od przewodnika po testowaniu aplikacji szynowych .

Również Railscast ma kilka doskonałych screencasts o tym, jak korzystać z różnych narzędzi badawczych.

Co muszę przetestować?

Zacznę od modeli, ponieważ są łatwe do przetestowania. Prosta zasada jest taka, że ​​w teście musisz uwzględnić wszystkie stwierdzenia if.

Powinieneś przetestować cel metody (aby upewnić się, że działa zgodnie z oczekiwaniami), a także wszystkie przypadki skrajne.

Upewnij się również, że nie skończysz na testowaniu.

Jakiego klejnotu / wtyczki powinienem użyć? Czy powinienem używać rspec? Coś innego?

Kiedy zaczynasz, po prostu użyj Test Unit. Możesz użyć rspeclub cucumberpo zapoznaniu się z podstawami.

Autotestto fajne narzędzie, jeśli chcesz być naprawdę sterowany testami. Ale nie jest to wymagane.

Po ukończeniu wszystkich zajęć testowych, jak je wdrożyć?

Nie jestem pewien co do pytania. Zazwyczaj nie wdrażasz testów. Gdy masz już wszystkie klasy testowe, po prostu wpisz „rake test”, aby uruchomić wszystkie testy.

Jak bardzo czasochłonne jest TDD?

To naprawdę oszczędza czas. Jeśli lubisz puzzle labiryntowe, wiesz, że prawie zawsze łatwiej jest je rozwiązać, przechodząc od końca do początku. To samo z TDD. Bez Test Driven nieustannie myślisz „co powinienem zrobić”. W przypadku Test Driven test powie Ci, co dalej zrobić (psuje się, jeśli nie ma logiki, więc musisz tylko naprawić zepsutą część). Ponadto masz mniej błędów, co na dłuższą metę pozwoli Ci zaoszczędzić dużo czasu.

Czy muszę przeczytać książkę na ten temat, czy też mogę uzyskać wszystko, bawiąc się nią i czytając samouczki online? Jeśli muszę przeczytać książkę, jaką książkę?

Nie potrzebujesz książki. Najbardziej efektywnym sposobem nauczenia się czegokolwiek jest: po prostu zrób to. Wróć do książki lub zasobów online, gdy napotkasz pytanie lub problem. To też jest zwinne.

W twoim przykładzie rzeczy, które wymagają przetestowania to: Kontakt może być powiązany z 1 firmą, Firma może mieć wiele kontaktów, tworzyć sposoby tworzenia kontaktów i łączyć kontakty z firmami.

class CompanyTest <Test::Unit
    def test_relationship # test associations/relationships
        c = companies(:some_company)
        assert_equal [a list of contacts], c.contacts # make sure a company can have multiple contacts
    end
end

class ContactTest<Test::Unit
   def  test_relationships
        c = contact(:some_contact)
        assert_equal some_company, c.company # make sure the contact link to 1 company
   end

   def  test_create/add
        # test create contacts, here you need to make sure the contact is created correctly, and linked to company correctly
   end
end
ez.
źródło
3
Link do artykułu jest uszkodzony, ale znalazłem go tutaj: web.archive.org/web/20100325215651/http://bloritsch.d-haven.net/…
fivetwentysix
13

Stworzyłem 6-odcinkową serię wideo, której nauczano na publicznych zajęciach w San Francisco latem 2010 roku. Materiał obejmuje testowanie i wydajność programistów w Railsach 2.3 przy użyciu RSpec 1.3. Nieco przestarzałe, ale główne koncepcje dotyczą Rails 3 z Rspec 2.x

http://www.rubyfocus.biz/class_video/2010/07/19/rails_tdd_class_1.html

Wolfram Arnold
źródło
5

TDD polega przede wszystkim na pisaniu testów. To w zasadzie zmusza cię do napisania własnego klienta przed napisaniem kodu aplikacji. Cykl zazwyczaj polega na napisaniu testu dla nieistniejącego interfejsu API, uruchomieniu testu spodziewając się niepowodzenia, napisaniu kodu API, ponownym uruchomieniu testu i upewnieniu się, że przeszedł pomyślnie. Następnie napisz swój następny test ... i tak dalej.

Możesz być także zainteresowany tym przewodnikiem po Railsach .

Andy Gaskell
źródło
3

Jakiego klejnotu / wtyczki powinienem użyć?

Zawsze lubiłem Powinien .

Jak bardzo czasochłonne jest TDD?

Powodem, dla którego zawsze preferowałem rozwój TDD jest to, że koncentruje się na tym, jak zaimplementuję określony fragment kodu. Mam anegdotyczne przeczucie, że ilekroć mocniej trzymam się zasad TDD, spędzam mniej czasu na późniejszej przeróbce. Jednak ilość czasu zależy od tego, jak dobrze piszesz testy jednostkowe. Jeśli testy jednostkowe nie wychwytują oczekiwanego zachowania, cały czas poświęcony na nie jest zmarnowany.

Patrick Robertson
źródło