2009-06-19 10 views
6

Jestem obecnie na stanowisku co-op pracującym nad projektem zbliżającym się do ukończenia z innym studentem co-op. Ponieważ projekt ten został przekazany od spółdzielni do spółdzielni, po drodze podjęto kiepskie praktyki, a testy pozostały do ​​końca. Zdecydowałem, że chciałbym pisać testy jednostkowe, aby nauczyć się czegoś nowego podczas testów.Kroki, które należy wykonać, aby powoli zintegrować testowanie jednostkowe z projektem

Pracuję jednak nad 3-warstwową, ściśle powiązaną aplikacją, która wydaje się niemożliwa do testowania jednostki w jej obecnej formie. Nie chcę zrzucić drugiego studenta co-opowego bez znajomości żadnej z tych koncepcji, refaktoryzując kod nie do poznania z dnia na dzień. Jakie kroki powinienem podjąć, aby powoli przeciągnąć kod w stronę testowalności jednostki? Czy powinienem najpierw wdrożyć wzór fabryczny i pozwolić drugiemu studentowi zapoznać się z tym przed pójściem do przodu?

Moje przeprosiny, jeśli moja wiedza jest wadliwa i nie powinno być żadnego problemu. Jestem na to nowy :)

+1

osobiście, jeśli myślisz, że możesz zrobić ogromne ilości refaktoringu, dlaczego nie dostać innego ucznia, aby przyjść i siedzieć z wami i jak iść, on/ona może poprosić pytania i może on/ona ma własne pomysły. Nasza branża działa szybko, tak jak na pewno wiesz, więc twój partner nie spotka innych twórców tak wyrozumiałych jak ty. Dodałem to jako komentarz, ponieważ w rzeczywistości nie odpowiada na pytanie dotyczące testów jednostkowych. Chciałem tylko dać ci coś innego do przemyślenia. Powodzenia! – StevenMcD

+0

@FailBoy dzięki za komentarz :) Jest to zdecydowanie opcja. Jednak nie wydają się nadmiernie zainteresowani pracą nad rzeczami obok siebie. Po prostu wydaje się być cechą osobowości. Wolą przejrzeć wszystkie wprowadzone przeze mnie zmiany i zadawać pytania później. Po prostu nie chcę wysyłać ich w stan szoku i musieć wycofać wszystkie moje zmiany w kodzie. – Chris

Odpowiedz

7

Working Effectively with Legacy Code przez Michaela Feathers

trudno powiedzieć, czy wdrożenie wzoru fabryka będzie zrobić jakieś dobre, zależy od tego, co kod robi :)

+5

+1 Oto podsumowanie tego, co dostaniesz w książce i jak utworzyć "szew", który możesz bezpiecznie przetestować: http://www.objectmentor.com/resources/articles/WorkingEffectivelyWithLegacyCode.pdf –

1

W połowie projektu bardzo trudno jest rozpocząć nowe praktyki programistyczne. W przeszłości, kiedy pracowałem nad projektami, które nie były testowane jednostkowo od samego początku, dobrym podejściem jest ustalenie zasady, że "nowy kod musi mieć testy jednostkowe", ale nie wywierać nacisku na testy jednostkowe pisane dla starego kodu.

Oczywiście, nawet to jest trudne, gdy struktura projektu nie nadaje się do testowalności.

Moja najlepsza rekomendacja to mały krok.

Rozpocznij od utworzenia zespołu testowego jednostki (lub projektu lub czegoś podobnego) bez żadnych testów. Następnie znajdź pojedynczy mały obszar kodu, który jest dość dobrze zdefiniowany i oddzielony, i napisz kilka testów jednostkowych dla tego obszaru. Postaraj się, aby Twój koder również się rozejrzał i zacznij robić "najlepsze praktyki", np. Testowanie jednostki za każdym razem, gdy jakiś kod jest sprawdzany (automatycznie, jeśli to możliwe).

Gdy już to zrobisz, możesz powoli dodawać kolejne.

Klawisz powoli. I tak jak powiedziałem, łatwiej jest zwolnić stary kod z testów na samym początku. Zawsze możesz wrócić do niego później, gdy Twój zespół zrozumie ideę testowania jednostkowego i będzie lepiej, gdy je napiszesz.

+0

To świetny pomysł. Jednak większość funkcji została już wdrożona. Robię to głównie z doświadczenia w testach jednostkowych, ponieważ ręczne testowanie przez kilka następnych tygodni byłoby całkiem suche. – Chris

+0

Z brzmienia tego, jest to projekt studencki tak? Jeśli powiesz, że większość funkcji została wykonana, nie możesz pozostać tak długo w lewo, po prostu zrób kopię zapasową i wprowadzaj zmiany. Jeśli twój partner nie rozumie, to nie ma znaczenia, projekty prawie w każdym razie. Otrzymasz swoje doświadczenie, a projekt jest nadal w porządku.Połóż na piśmie, że nauczyłeś się, że testowanie jednostkowe najlepiej będzie wykonać od początku następnym razem = :) –

+0

To prawda! Rodzaj. Jest spółdzielnią rządową, więc wszystko idzie wolno. Dopóki szef nie sprawdzi aplikacji i nie określi, jakie zmiany chce (może to potrwać miesiące), jesteśmy w trybie testowym. W tym momencie system może się odwrócić. Testy jednostkowe nie tylko pomogą mi się uczyć, ale także ułatwią ten proces, miejmy nadzieję. Po prostu nie chcę być lekceważący i pozostawić inną spółdzielnię w ciemności :) – Chris

1

Jak o pisaniu serię testów czarnej skrzynki wokół główną elementy funkcjonalności w twoim kodzie? Ponieważ wspominasz, że jest to projekt ASP.NET, możesz użyć architektury, takiej jak WaitN lub Selenium, aby zautomatyzować przeglądarkę internetową. Daje to podstawowy zestaw funkcji, które powinny pozostać niezmienne, bez względu na to, jak bardzo kod się zmienia.

Po wykonaniu wygodnej liczby testów testujących funkcjonalność wysokiego poziomu projektu, zacznę nurkować w kodzie, a jak wspomina Simon P. Stevens, praca powoli. Chwyć za (darmową!) Kopię Refactor! for Visual Basic, dzięki czemu będziesz mógł automatycznie wykonać kilka podstawowych operacji refaktoryzacji, takich jak metoda wyodrębniania. Możesz radykalnie zwiększyć testowalność bez zmiany jakiejkolwiek funkcjonalności, dzieląc większe porcje kodu na mniejsze, bardziej sprawdzalne porcje.

2

Working Effectively with Legacy Code Michaela Feathersa (dostępne również w Safari, jeśli masz abonament) jest doskonałym źródłem do Twojego zadania.Autor definiuje dotychczasowy kod jako kod bez testów jednostkowych, i podaje praktyczne opisy partii konserwatywnych technik - koniecznych, ponieważ pracujesz bez sieci bezpieczeństwa - do dostarczania testowanego kodu. Spis treści:

  • części: I The Mechanics of Change
    • Rozdział 1. Zmiana oprogramowania
      • Cztery powody do zmiany oprogramowania
      • Risky Zmień
    • Rozdział 2 Praca z komentarzem
      • Co to jest testowanie jednostek?
      • Nadrzędne Testowanie
      • testowe Pokrycia
      • Legacy Code Change Algorytm
    • Rozdział 3. Wykrywanie i separacja
      • udaje Współpracownicy
    • Rozdział 4. Seam Model
      • ogromny arkusz Tekst
      • szwy
      • szwów Rodzaje
    • Rozdział 5. Narzędzia
      • Automated refaktoringu Narzędzia
      • Mock Objects
      • Unit-Testing uprzęży
      • generalnego Szelki testowe
  • Część: II Zmiana oprogramowania
    • Rozdział 6. Nie mam dużo czasu i muszę go zmienić
      • Sprout Method
      • Sprout Class
      • Wrap Method
      • Wrap Class
      • Podsumowanie
    • Rozdział 7.Trwa wiecznie dokonać zmiany
      • Zrozumienie
      • opóźnieniem
      • Przełamując Zależności
      • Podsumowanie
    • Rozdział 8. Jak mogę dodać funkcję?
      • Test-Driven Development (TDD)
      • Programowanie różnicy
      • Podsumowanie
    • Rozdział 9. Nie mogę tej klasie do testowania wiązek
      • przypadku Parametr drażniący
      • Przypadek ukrytej zależności
      • Sprawa Budowa Blob
      • przypadku drażniąco Globalny Dependency
      • przypadku Horrible Dołącz Zależności
      • Sprawa Cebula parametryczny
      • przypadku aliasem parametryczny
    • Rozdział 10. nie można uruchomić tej metody w teście wiązki
      • przypadku metody ukryte
      • Sprawa Feature „pomocne” Język
      • przypadku Undetectable Side Effect
    • Rozdział 11. muszę dokonać zmian. Jakie metody powinienem przetestować?
      • Wnioskowanie o efektach
      • rozumowanie Forward
      • Efekt rozmnażania
      • Narzędzia dla efektu rozumowania
      • Learning from Effect Analysis
      • Uproszczenie Effect Sketches
    • Rozdział 12. muszę Dokonaj wielu zmian w jednym obszarze. Czy muszę zerwać zależności dla wszystkich zaangażowanych klas?
      • przechwycenie Punkty
      • Sądząc ze szczyptą Projekt Punktów
      • Szczypta Punkt Pułapki
    • Rozdział 13.Muszę coś zmienić, ale nie wiem co napisać Testy Charakteryzacja Testy
      • znamiennej Klasy
      • Ukierunkowane Testowanie
      • heurystyczne do pisania Charakterystyka Testy
    • rozdział 14. Zależności od bibliotek zabijają mnie
    • Rozdział 15. Moje zgłoszenie to wszystkie wywołania interfejsu API
    • Rozdział 16. Nie rozumiem kodu Na tyle dobrze, aby zmienić go
      • Uwagi/Szkicowanie
      • listingu Markup
      • Scratch Refaktoryzacja
      • Usuń niewykorzystany kod
    • Rozdział 17. Moja aplikacja nie ma struktury
      • mówi Historia systemu
      • Naked CRC
      • Rozmowa Kontrola
    • Rozdział 18. mojego kodu testu jest w drodze
      • konwencji nazewnictwa klasy
      • Location Test
    • Rozdział 19. Mój projekt nie obiektowego. Jak dokonać bezpiecznych zmian?
      • Łatwy Case
      • A Hard Case
      • Dodawanie nowych zachowań
      • Korzystając z Object Orientacja
      • To wszystko Object Oriented
    • Rozdział 20. Ta klasa jest zbyt duży i Nie chcę, aby zyskał jakikolwiek większy
      • Seein g Obowiązki
      • innymi technikami
      • naprzód
      • Po Extract Class
    • Rozdział 21. Zmiana mam ten sam kod wszędzie
      • Pierwsze kroki
    • Rozdział 22.Muszę zmienić metodę potwór i nie mogę pisać testy dla niego
      • Odmian Monsters
      • Przeciwdziałanie Potwory ze wsparciem Automated refaktoringu
      • Podręcznik Refaktoryzacja Wyzwanie
      • Strategia
    • Rozdział 23. Skąd mam wiedzieć, że niczego nie łamie?
      • Hyperaware Montaż
      • Single-Gol Montaż
      • Zachowaj Podpisy
      • Lean na Compiler
    • rozdziale 24. czujemy się przytłoczeni. To nie ma nic lepszego
  • część: III Zależność łamiących Techniki
    • Rozdział 25.Zależnościami-niszczące Techniki
      • Dostosować parametr
      • Break Out metody Object
      • Definicja Zakończenie
      • hermetyzacji Globalny Referencje
      • Expose metoda statyczna
      • Wypis i zastąpić zadzwonić
      • Wypis i zastąpić metody fabryki
      • Extract and Override Getter
      • Extract Realizator
      • Interfejs Extract
      • Przedstaw Instance Delegator
      • Przedstaw Static Setter
      • link Zmiana
      • parametryzacji Konstruktor
      • parametryzacji Sposób
      • Primitivize Parametr
      • Pull Up Feature
      • dociśnij Zależność
      • Wymienić funkcyjny z wskaźnik funkcji
      • Wymień Globalny Reference z Getter
      • podklasy i zastąpić metodę
      • zastępują zmiennej instancji
      • Szablon redefinicji
      • redefinicji Tekst
  • Dodatek: Refaktoryzacja
    • Extract Method
Powiązane problemy