2009-07-29 9 views
5

Mamy projekt Pythona, który chcemy rozpocząć testowanie przy użyciu buildbot. Jego testy jednostkowe obejmują testy, które powinny działać tylko na niektórych platformach. Mamy więc testy, które powinny przejść na wszystkich platformach, testy, które powinny działać tylko na jednej konkretnej platformie, testy, które powinny przejść na platformach A, B, C i testy, które przechodzą na B i D.Jak dystrybuować i przeprowadzać testy jednostkowe dla danej platformy?

Co to jest? najlepszy sposób na zrobienie tego? Proste zestawy byłyby kłopotliwe, ponieważ, jak opisano, każdy test może mieć inną listę platform docelowych. Pomyślałem o dodaniu dekoratorów "@run_on" i "@ignore_on", które dopasowałyby platformy do metod testowania. Czy jest coś lepszego?

Odpowiedz

0

Zdecydowaliśmy się pójść z dekoratorów, że przy użyciu Platform Module i innych, sprawdź, czy testy powinny być wykonane , a jeśli nie, po prostu pozwólmy mu przejść (chociaż, widzieliśmy, że python2.7 ma już w swoim bagażniku wyjątek SkipTest, który mógłby zostać podniesiony w takich przypadkach, aby zignorować test).

+1

SkipTest jest również w nosie, z bardzo poręczną opcją --no-skip. – Almad

0

Brzmi jak poręczne miejsce dla ładowarki testowej.

Wyjazd http://docs.python.org/library/unittest.html#unittest.TestLoader.loadTestsFromName

Jeśli podasz jakieś odpowiednie konwencje nazewnictwa prawdopodobnie można tworzyć apartamentów na podstawie swoich badań konwencji nazewnictwa.

Jeśli mam test A, który jest uruchamiany w systemach AIX, Linux (wszystkie) i 32-bitowe, przetestuj B, który działa w systemach Windows 64, Linux 64 i Solaris, i przetestuj C, który działa we wszystkim poza HPUX i testuj D który działa na wszystkich ... Jaka jest możliwa konwencja nazewnictwa?

class TestA_AIX_Linux2_Win32(unittest.TestCase): 

class TestB_Win64_Linux64_Solaris(unittest.TestCase): 

class TestC_AIX_Linux2_Win32_Win64_Linux64_Solaris(unittest.TestCase): 

class TestD_All(unittest.TestCase): 

Najtrudniejszą częścią jest "nie HP/UX". Unikanie negatywnej logiki ułatwia życie. W takim przypadku wystarczy wymienić wszystkie systemy operacyjne, które nie są HP/UX. Lista jest dość krótka i rośnie powoli.

"Wszystkie" testy są po prostu oddzielnym wyszukiwaniem tekstu, które jest połączone z listą testów obecnej platformy w celu utworzenia kompletnego zestawu.

Można spróbować czegoś podobnego

class TextC_XHPUX(unittest.TestCase): 

Reguła dopasowywania tekst jest normalnie "_someOSName"; twoimi wyjątkami byłby dziwny filtr tekstowy, który mógłby zadzierać z nazwą "_X".

"Nie możemy mieć pozytywnej listy systemów operacyjnych. Co się stanie, jeśli dodamy nowy system operacyjny? Czy musimy zmienić nazwę każdego testu, aby jednoznacznie go uwzględnić?" Tak. Nowy rynek systemów operacyjnych rozwija się powoli, nie jest to bolesne w zarządzaniu.

Alternatywą jest uwzględnienie informacji w obrębie każdej klasy (tj. Funkcji klasy) lub dekoratora i użycie niestandardowego programu ładującego klasy, który ocenia funkcję klasy.

+0

Nie rozumiem, jak to dokładnie pomoże. Jeśli mam test A, który wykonuje się w systemie AIX, Linux (wszystkie) i 32-bitowym systemie Windows, przetestuj B, który działa w systemach Windows 64, Linux 64 i Solaris, i przetestuj C, który działa we wszystkim poza HPUX i przetestuj D, który działa we wszystkim ... Jaka jest możliwa konwencja nazewnictwa? – abyx

2

na kilka razy użyłem to bardzo proste podejście modułów testowych:

import sys 
import unittest 

if 'win' in sys.platform: 
    class TestIt(unittest.TestCase): 
     ... 

if 'linux' in sys.platform: 
    class TestIt(unittest.TestCase): 
     ...