5

W naszym projekcie mamy wiele testów jednostkowych. Pomagają one utrzymać projekt w dobrym stanie.Jak uruchomić testy integracji?

Oprócz nich mamy zestaw testów, które są testami jednostkowymi, ale zależą od jakiegoś zewnętrznego źródła. Nazywamy je testami zewnętrznymi. Na przykład mogą czasem uzyskać dostęp do usług internetowych.

Podczas gdy testy jednostkowe są łatwe do uruchomienia, testy integracyjne czasami nie mogły przejść: na przykład z powodu błędu limitu czasu. Te testy mogą zająć zbyt wiele czasu.

Obecnie przeprowadzamy testy integracji/testów zewnętrznych, aby uruchomić je podczas opracowywania odpowiednich funkcji.

Do testów jednostkowych używamy TeamCity do ciągłej integracji.

W jaki sposób uruchamiasz testy jednostki integracyjnej i kiedy je uruchamiasz?

+0

Jak pewnie w tej dyskusji szukam, jak kategoryzować testy integracji. A teraz co mogę dodać samodzielnie: 1. Przetestuj, czy nasze oprogramowanie komunikuje się zgodnie z oczekiwaniami za pomocą zdalnego oprogramowania (do tego można użyć zdalnych makiet ws), jak zauważył S. Lott). 2. Sprawdź, czy usługa zdalna działa zgodnie z oczekiwaniami. – Vladimir

Odpowiedz

2

W naszym projekcie mamy oddzielny pakiet do testów zwykłych/zwykłych jednostek oraz oddzielny pakiet do testów integracyjnych. Są dwa powody:

  1. wydajność: Testy integracyjne są znacznie wolniejsze, kruchość
  2. testowy: testy integracyjne nie częściej ze względu na warunki związane z ochroną środowiska (podać liczbę fałszywych alarmów).

Używamy TeamCity jako naszego głównego serwera Continuous Integration i Maven jako systemu kompilacji. Do przeprowadzenia testów używamy następującego algorytmu:

  1. Przeprowadzamy testy jednostkowe w ramach IDE Eclipse i przed każdym zatwierdzeniem.
  2. Testy jednostkowe przeprowadzamy automatycznie po każdym zatwierdzeniu na agentach TeamCity przy użyciu Maven's mvn clean install
  3. Testy integracyjne uruchamiamy automatycznie w agencie TeamCity po zakończeniu "głównej" kompilacji.

Nasz sposób wyzwolić testy integracyjne wykonanie jest przez skonfigurowanie zadania integration.tests TeamCity do zależeć na „głównym” continous.build zadania, zobacz tutaj szczegóły: http://confluence.jetbrains.net/display/TCD4/Dependencies+Triggers

Prowadzimy tylko testy integracyjne (z wyłączeniem testy jednostkowe) autor:

  • stosując oddzielny katalog o nazwie "src/to/java", aby zachować integracyjne testów
  • wyłączeniem domyślnie to źródło FOLDE r z konfiguracji maven-surefire-plugin (element konfiguracji/wykluczeń),
  • przy użyciu profilu Maven o nazwie "integracja" w celu wykluczenia regularnych testów jednostkowych i włączenia testów z "src/it/java" (ten profil jest skonfigurowany przez przejście -Pintegracja w zadaniu integration.tests).
+0

Jest to najbardziej zbliżony wybór dla mnie, z wyjątkiem tego, że zastąpilibyśmy niektóre testy integracyjne testami jednostkowymi z makietami. – Vladimir

1

Wszystkie testy przeprowadzamy w jednym ogromnym apartamencie. Uruchomienie trwa 7 minut.

Nasze testy integracji tworzą fałszywe serwery. Nigdy nie tracą czasu - z wyjątkiem sytuacji, gdy test wymaga od serwera przekroczenia limitu czasu.

Mamy więc następujące rzeczy. (Przykładowy kod to Python)

class SomeIntegrationTest(unittest.TestCase): 
    def setUp(self): 
     testclient.StartVendorMockServer(18000) # port number 
     self.connection = applicationLibrary.connect('localhost', 18000) 
    def test_should_do_this(self): 
     self.connection.this() 
     self.assert... 
    def tearDown(self): 
     testClient.KillVendorMockServer(18000) 

Ma to pewne ograniczenia - zawsze rozwidla serwer próbny klienta dla każdego testu. Czasami to jest w porządku, a czasami to zbyt dużo rozpoczynania i kończenia.

Mamy również następujące rodzaje rzeczy

class SomeIntegrationTest(unittest.TestCase): 
    def setUp(self): 
     self.connection = applicationLibrary.connect('localhost', 18000) 
    def test_should_do_this(self): 
     self.connection.this() 
     self.assert... 

if __name__ == "__main__": 
    testclient.StartVendorMockServer(18000) # port number 
    result= unittest.TextTestRunner().run() 
    testclient.KillVendorMockServer(18000) 
    system.exit(result.failures + result.errors) 

W celu wsparcia tego badania, mamy szereg wyśmiewali-up serwerów dla różnych rodzajów testów integracyjnych.

+0

Czy wymagasz od programistów uruchomienia testów przed odprawą? –

+0

To dobre podejście do makiet zdalnych usług. Myślę, że tego nie robimy, ponieważ czasami trudno jest zrobić makietę - lub może to zająć trochę czasu. Czasami nawet nie wiem, jak działa zdalny ws. Po trzecie, pomocne jest sprawdzenie, czy zdalna usługa działa prawidłowo zgodnie z oczekiwaniami. Mieliśmy przypadki, w których główny dostawca usług miał problemy, które mogłyby potencjalnie znaleźć się w wyniku niektórych testów zewnętrznych. – Vladimir

+0

@ Vladimir: "czasami nawet nie wiem jak działa zdalny ws". Fałszywy. Wiesz, co wysyła i otrzymuje Twoja aplikacja. To wszystko, co musisz zrobić w Makiecie. Nic więcej, tylko na tyle, aby zdać test. –

3

Używamy Maven2: maven-surefire-plugin do uruchamiania testów jednostkowych (w fazie testowej) i maven-failsafe-plugin do testów integracyjnych (faza testu integracji).

Domyślnie wszystkie testy są uruchamiane podczas budowy projektu, jednak testy integracji można wyłączyć za pomocą profili.

W wielu przypadkach testy integracyjne stanowią część modułu, w niektórych przypadkach istnieją również dedykowane moduły, które wykonują jedynie testy integracyjne.

Jeden z zespołów wykorzystuje także Fitnesse do testów akceptacyjnych. Testy te są również w dedykowanych modułach.

Używamy Hudson dla CI.

+0

Dzięki za wzmianka o Fitnesse - już o tym słyszałem. A teraz obejrzałam prezentację - to od Roberta Martina. Wygląda dobrze. Spróbuję pomyśleć, jak możemy to zintegrować dla naszych celów! Czy masz wiele testów akceptacyjnych w Fitnesse? – Vladimir

+0

Mój zespół - nie, ten drugi zespół naprawdę wykonał wiele zadań jako testy akceptacyjne. – lexicore

Powiązane problemy