2009-12-03 16 views
25

Ich habe ein Skript, das als Wrapper für einige Komponententests fungiert, die mit dem Python unittest-Modul geschrieben wurden. Neben ein paar Dateien Reinigung, einen Ausgangsstrom erzeugt und einen Code zu erzeugen, lädt es Testfälle in einer Suite zur Bestimmung der Ausgabe verwendet bin mit mitPython, Komponententest - Übergeben Sie Befehlszeilenargumente an setUp von unittest.TestCase

unittest.TestLoader().loadTestsFromTestCase() 

ich schon optparse ziehen mehrere Befehlszeilenargumente Ort, ob Code neu generiert werden soll und ob etwas aufgeräumt werden soll. Ich möchte auch eine Konfigurationsvariable, nämlich eine Endpunkt-URI, zur Verwendung innerhalb der Testfälle übergeben.

Ich weiß, ich kann eine OptionParser auf die Setup-Methode des Testfall hinzufügen, aber ich möchte stattdessen die Option setUp übergeben. Ist dies mit loadTestsFromTestCase() möglich? Ich kann über die zurückgegebenen TestSuite 's TestCases iterieren, aber kann ich Setup auf dem TestCases manuell aufrufen?

** EDIT ** Ich wollte darauf hinweisen, dass ich in der Lage bin, die Argumente zu setUp passieren, wenn ich über die Tests durchlaufen und rufen setUp manuell wie:

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

Aber ich bin mit xmlrunner dafür und seine Laufmethode dauert ein TestSuite als ein Argument. Ich nehme an, es wird die setUp-Methode selbst ausführen, also würde ich die Parameter innerhalb der XMLTestRunner benötigen.

Ich hoffe, das macht Sinn.

Antwort

43

Nun, ich möchte das gleiche tun und würde diese Frage selbst stellen. Ich wollte den folgenden Code verbessern, weil er doppelt vorhanden ist. Es lässt mich in Argumente senden Testcase testen, aber:

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

Was ist hier hilfreich? – SIslam

+0

HelpSpot ist eine Kundendienstanwendung von UserScape. Ich habe eine Python-Schnittstelle für seine API geschrieben - https://github.com/JohnSpeno/python-helpspot – jps

+0

Damit dies ähnlich funktioniert wie "unittest.main()" sollten Sie 'sys.exit (not result.wasSuccessful()) 'bis zum Ende. – abergmeier

5

Ich würde auf jeden Fall davon abraten Argumente wie setUp zu übergeben; setUp soll implizit aufgerufen werden, wenn ein Test ausgeführt wird. Sie sollten es daher nicht explizit so aufrufen.

Eine Möglichkeit, die Sie angehen könnten, wäre, die Werte festzulegen, die Sie als Umgebungsvariablen oder Werte in einem global zugänglichen "Kontext" -Modul festlegen müssen, damit Testfälle bei Bedarf darauf zugreifen können. Ich würde für die Verwendung von Umgebungsvariablen gehen, da es in Bezug auf die Tests flexibler ist (Sie sind dann nicht mehr auf Befehlszeilenargumente angewiesen).

+4

Und dann einige andere Code beruht auf einer Umgebungsvariablen mit dem gleichen Namen, groß. – GNUnit

0

Wenn Sie die Attribute in der init-Methode definieren, dann können Sie einfach, sie alle im Konstruktor wie dies passieren ..

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

Sehr schön. Genau das, was ich gesucht habe. –

+1

II wollte die '-i' Option hinzufügen, und benutzte den obigen Code ... Ich starte meinen Test über' .. \ .. \ python \ python -m unittest -v "test_activation.test_activation" -i "Eingabedatei" ' . Warum gibt dies mir einen Fehler 'test_activation.py: Fehler: keine solche Option: -m'? – Danijel

+0

Das hat nicht für mich funktioniert.Die folgende Zeile zum Entfernen von Argumenten funktionierte jedoch. del sys.argv [1:] – Indrajeet

Verwandte Themen