У меня есть набор тестов, и я пытаюсь заставить его работать с тестами, которые я создал. Тестирование выполняется, если я запускаю их отдельно, но я хочу запустить их в тестовом наборе. В приведенном ниже коде показан созданный набор тестов:
import unittest
def suite():
modules_to_test = ('TestAbsoluteMove', 'TestContinuousMove') # and so on
alltests = unittest.TestSuite()
for module in map(__import__, modules_to_test):
alltests.addTest(unittest.findTestCases(module))
return alltests
if __name__ == '__main__':
unittest.main(defaultTest='suite')
Я поместил этот код в свой тестовый код, чтобы связать его с пакетом:
class AbsoluteMoveTestSuite(unittest.TestSuite):
def makeAbsoluteMoveTestSuite():
suite = unittest.TestSuite()
suite.addTest(TestAbsoluteMove("BasicAbsolutePan"))
suite.addTest(TestAbsoluteMove("VerifyAbsolutePan"))
suite.addTest(TestAbsoluteMove("VerifyAbsoluteTilt"))
suite.addTest(TestAbsoluteMove("VerifyAbsolutePanSpeed"))
suite.addTest(TestAbsoluteMove("VerifyAbsoluteTiltSpeed"))
return suite
def suite():
return unittest.makeSuite(TestAbsoluteMove)
Выпущенная ошибка утверждает, что нет модулей с именем TestAbsoluteMove и TestContinuousMove. Кто-нибудь знает, как заставить этот код работать?
Спасибо
Nose делает такую вещь без проблем. Он будет автоматически определять ваши тесты и запускать их как набор. (Вы также можете запустить определенные тесты, передав ему флаг.)
вот как я создаю свой testuite (loadTestFromTestCase автоматически обнаруживает ваши тесты)
def suite():
""" returns all the testcases in this module """
return TestLoader().loadTestsFromTestCase(AbsoluteMoveTestSuite)
и для запуска их сразу, у меня есть пакет, который включает все подсайты (обратите внимание на все импортные данные, вам нужно будет импортировать их до того, как они будут доступны в вашем новом модуле)
import sys
import unittest
import test.framework.asyncprocess as a
import test.framework.easyconfig as e
import test.framework.modulegenerator as mg
import test.framework.modules as m
import test.framework.filetools as f
import test.framework.repository as r
import test.framework.robot as robot
import test.framework.easyblock as b
import test.framework.variables as v
import test.framework.github as g
import test.framework.toolchainvariables as tcv
import test.framework.toolchain as tc
import test.framework.options as o
import test.framework.config as c
# call suite() for each module and then run them all
SUITE = unittest.TestSuite([x.suite() for x in [r, e, mg, m, f, a, robot, b, v, g, tcv, tc, o, c]])
# uses XMLTestRunner if possible, so we can output an XML file that can be supplied to Jenkins
xml_msg = ""
try:
import xmlrunner # requires unittest-xml-reporting package
xml_dir = 'test-reports'
res = xmlrunner.XMLTestRunner(output=xml_dir, verbosity=1).run(SUITE)
xml_msg = ", XML output of tests available in %s directory" % xml_dir
except ImportError, err:
sys.stderr.write("WARNING: xmlrunner module not available, falling back to using unittest...\n\n")
res = unittest.TextTestRunner().run(SUITE)
TestAbsoluteMove - это класс, и он должен откуда-то исходить. Где бы ни был определен ваш класс AbsoluteMoveTestSuite, вам необходимо импортировать TestAbsoluteMove.
unittest
- это немного боль, чтобы использовать это. Я бы очень хотел повторить, что вы следите за советом Элисон на nose
или используете мой личный любимый инструмент тестирования Python py.test. Просто создайте функции, следуя конкретному соглашению об именах и позвольте ему разорвать! Вся вещь xUnit действительно не вписывается в территорию Python.