У меня есть сценарий, который делает различные вещи и доступ paramenters использующий sys.argv, но когда сценарий добирается до unittest части кода, это говорит, что нет никакого модуля для этого. Сценарий, который я имею:
class MyScript():
def __init__(self):
self.value = sys.argv[1]
def hello(self):
print self.value
def suite(self):
modules_to_test = ('external_sanity_onvif', 'starttest')
alltests = unittest.TestSuite()
for module in map(__import__, modules_to_test):
alltests.addTest(unittest.findTestCases(module))
return alltests
if __name__ == '__main__':
Run = MyScript()
Run.hello()
log_file = 'log_file.txt'
test_file = open(log_file, "w")
runner = unittest.TextTestRunner(test_file)
unittest.main(defaultTest='Run.suite', testRunner=runner)
Скажите, что я вхожу ./script.py Hello
в командной строке. Ошибка, которую я получаю:
AttributeError: 'module' object has no attribute 'Hello'
Если я удаляю unittest модуль, он работает. Также, если я удаляю журнал testrunner и оставляю его в:
unittest.main(defaultTest='Run.suite')
Это все еще не работает.
Может любой помогать.
Спасибо
Я попробовал этот взлом, но он все еще пытается читать sys.argv
.
project = sys.argv[4:]
sys.argv = sys.argv[0:4]
Я попробовал это просто argv
но это все еще утомляется для чтения дополнительных параметров.
Проблема в том, что unittest.main ()
хочет получить ваш драгоценный argv для собственного использования! Он использует либо аргумент argv, который вы даете ему в качестве параметра функции, либо sys.argv
, если вы не указываете его явно, и пытается загрузить тесты с указанными вами аргументами. В данном случае это означает, что он ищет либо подмодуль с именем Hello
, либо класс TestCase
с именем Hello
, либо метод тестового примера в классе тестового примера с именем Hello
или вызываемый объект с именем Hello
, который возвращает экземпляр TestCase
или TestSuite
, все внутри вашего модуля script.
Есть несколько способов исправить это:
unittest.main ()
и самостоятельно вызвать низкоуровневые функции unittest для настройки и выполнения заданных вами тестовых примеров. sys.argv
и используйте поведение unittest.main ()
в ваших интересах. Если ваш модуль не предназначен для независимого запуска , кроме в качестве модульного теста, это, вероятно, имеет смысл, поскольку вызывающие вашего модуля могут не ожидать, что вы прочитаете их argv! argv = [sys.argv [0]]
в качестве аргумента unittest.main ()
; это должно удерживать его от попыток прочитать ваше.Вообще говоря, идея модульного тестирования заключается в том, что тесты выполняются без внешнего драйвера. Например. вы не хотите зависеть от ввода из командной строки. Решение, которое вы ищете, может заключаться в использовании Fixtures?
import sys
import unittest
class MyScript(unittest.TestCase):
def setUp(self):
self.value = "Default Value"
def setHello(self, value):
self.value = value
def hello(self):
return self.value
class UserA(MyScript):
def setUp(self):
self.setHello("UserA")
def testMyName(self):
self.failUnlessEqual(self.hello(), "UserA")
class UserB(MyScript):
def setUp(self):
self.setHello("UserB")
def testMyName(self):
self.failUnlessEqual(self.hello(), "UserB")
if __name__ == '__main__':
unittest.main()
Python предоставляет вам всю возможную информацию, и если вы не хотите публиковать весь набор вещей, которые вы пытаетесь протестировать, мы можем только догадываться о том, чего вы пытаетесь достичь. Ошибка говорит, что нет атрибута с именем «Hello», поэтому, возможно, модули, которые вы пытаетесь протестировать, должны получить такую переменную, функцию или что-то еще.
Есть ли причина, по которой вы не используете просто unittest.main ()
?