2009-12-03 19 views
25

Mam skrypt, który działa jako opakowanie dla niektórych testów jednostkowych napisanych przy użyciu modułu Python unittest. Oprócz czyszczenia niektóre pliki, tworząc strumień wyjściowy i generowania kodu, ładuje przypadków testowych w Apartamencie, użyjPython, test jednostkowy - Przekaż argumenty wiersza poleceń do setUp unittest.TestCase

unittest.TestLoader().loadTestsFromTestCase() 

jestem już przy użyciu optparse wyciągnąć kilka argumentów wiersza polecenia używane do określania wyjście lokalizacja, czy zregenerować kod i czy wykonać pewne czynności porządkowe. Chcę również przekazać zmienną konfiguracyjną, a mianowicie URI punktu końcowego, do użytku w przypadkach testowych.

Zdaję sobie sprawę, że mogę dodać OptionParser do metody setUp TestCase, ale chcę zamiast tego przekazać opcję setUp. Czy jest to możliwe przy użyciu loadTestsFromTestCase()? Mogę iterować nad zwróconym TestSuite 's TestCases, ale czy mogę ręcznie wywołać setUp na TestCases?

** EDIT ** Chciałem podkreślić, że jestem w stanie przekazać argumenty setUp gdybym iteracyjne nad testami i nazywają setUp ręcznie jak:

(options, args) = op.parse_args() 
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions) 
for test in suite: 
    test.setUp(options.soap_uri) 

Jednakże używam xmlrunner dla tej i jego metody uruchamiania przyjmuje argument jako argument TestSuite. Zakładam, że uruchomi on samą metodę setUp, więc potrzebowałbym parametrów dostępnych w ramach XMLTestRunner.

Mam nadzieję, że to ma sens.

Odpowiedz

43

Cóż, chcę zrobić to samo i miałem zamiar zadać to pytanie osobiście. Chciałem poprawić poniższy kod, ponieważ ma on duplikację. To nie pozwól mi wysłać argumentów przetestować TestCase jednakże:

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.hs = helpspot.HelpSpot(path, user, pword) 

    def test_version(self): 
     a = self.hs.version() 
     b = self.hs.private_version() 
     self.assertEqual(a, b) 

    def test_get_with_param(self): 
     a = self.hs.filter_get(xFilter=1) 

    def test_unknown_method(self): 
     self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple) 

if __name__ == '__main__': 
    import sys 
    user = sys.argv[1] 
    pword = sys.argv[2] 
    path = sys.argv[3] 

    test_loader = unittest.TestLoader() 
    test_names = test_loader.getTestCaseNames(TestHelpSpot) 

    suite = unittest.TestSuite() 
    for test_name in test_names: 
     suite.addTest(TestHelpSpot(test_name, path, user, pword)) 

    result = unittest.TextTestRunner().run(suite) 
    sys.exit(not result.wasSuccessful()) 
+0

Co to jest punkt pomocy? – SIslam

+0

HelpSpot to aplikacja obsługi klienta z UserScape. Napisałem interfejs Pythona dla jego API - https://github.com/JohnSpeno/python-helpspot – jps

+0

Aby to działało podobnie do 'unittest.main()' powinieneś dodać 'sys.exit (not result.wasSuccessful()) 'do końca. – abergmeier

5

Zdecydowanie odradzam przekazywanie argumentów do setUp w ten sposób; Polecenie setUp ma być wywoływane niejawnie podczas uruchamiania testu, więc nie powinieneś jawnie nazywać go w ten sposób.

Jednym ze sposobów rozwiązania tego problemu byłoby ustawienie wartości, które należy ustawić jako zmienne środowiskowe lub wartości w globalnie dostępnym module "kontekstowym", który umożliwiłby przypadkom testowym dostęp do nich w razie potrzeby. Chciałbym użyć zmiennych środowiskowych, ponieważ jest bardziej elastyczny pod względem uruchamiania testów (nie polegasz już na argumentach wiersza poleceń).

+4

A potem inny kod opiera się na zmiennej środowiskowej o tej samej nazwie, świetnie. – GNUnit

0

Jeśli zdefiniować atrybuty w metodzie init następnie można po prostu przejść je wszystkie w konstruktorze tak ..

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.path = path 
     self.user = user 
     self.pword = pword 
.... 
.... 
.... 


if __name__ == '__main__': 
    True 

    suite = unittest.TestSuite() 
    suite.addTest(TestHelpSpot("test_version", path, user, pword))  

    unittest.TextTestRunner().run(suite) 
7
if __name__ == '__main__': 
    from optparse import OptionParser 
    parser = OptionParser() 
    parser.add_option("-z", "--zebra", 
         action="store_true", dest="zebra", default=False, 
         help="run like a zebra")  


    (options, args) = parser.parse_args() 

    if options.zebra: 
     zebrafy() 


    # remove our args because we don't want to send them to unittest 
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]): 
     if x in sys.argv: 
      sys.argv.remove(x) 


    unittest.main() 
+0

Bardzo ładne. Dokładnie to, czego szukałem. –

+1

II chciałem dodać opcję "-i" i użyłem powyższego kodu ... Rozpoczynam mój test przez '.. \ .. \ python \ python -m unittest -v" test_aktywacja.test_aktywacja "-i" plik_wejściowy "' . Dlaczego powoduje to błąd 'test_activation.py: error: brak takiej opcji: -m'? – Danijel

+0

To nie działa dla mnie.Jednak działał następujący wiersz do usuwania argumentów. del sys.argv [1:] – Indrajeet

Powiązane problemy