Проблема с sys.argv[1], когда unittest модуль находится в сценарии

У меня есть сценарий, который делает различные вещи и доступ 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 но это все еще утомляется для чтения дополнительных параметров.

11
задан chrissygormley 18 May 2010 в 15:42
поделиться

3 ответа

Проблема в том, что unittest.main () хочет получить ваш драгоценный argv для собственного использования! Он использует либо аргумент argv, который вы даете ему в качестве параметра функции, либо sys.argv , если вы не указываете его явно, и пытается загрузить тесты с указанными вами аргументами. В данном случае это означает, что он ищет либо подмодуль с именем Hello , либо класс TestCase с именем Hello , либо метод тестового примера в классе тестового примера с именем Hello или вызываемый объект с именем Hello , который возвращает экземпляр TestCase или TestSuite , все внутри вашего модуля script.

Есть несколько способов исправить это:

  • Обойти unittest.main () и самостоятельно вызвать низкоуровневые функции unittest для настройки и выполнения заданных вами тестовых примеров.
  • Удалите зависимость вашего кода от sys.argv и используйте поведение unittest.main () в ваших интересах. Если ваш модуль не предназначен для независимого запуска , кроме в качестве модульного теста, это, вероятно, имеет смысл, поскольку вызывающие вашего модуля могут не ожидать, что вы прочитаете их argv!
  • Разделите тестовый код и основную процедуру в отдельный тестовый модуль. Вам все равно придется выяснить, как добавить правильный argv в свой код, хотя и из тестового модуля.
  • Укажите argv = [sys.argv [0]] в качестве аргумента unittest.main () ; это должно удерживать его от попыток прочитать ваше.
17
ответ дан 3 December 2019 в 04:51
поделиться

Вообще говоря, идея модульного тестирования заключается в том, что тесты выполняются без внешнего драйвера. Например. вы не хотите зависеть от ввода из командной строки. Решение, которое вы ищете, может заключаться в использовании 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()
1
ответ дан 3 December 2019 в 04:51
поделиться

Python предоставляет вам всю возможную информацию, и если вы не хотите публиковать весь набор вещей, которые вы пытаетесь протестировать, мы можем только догадываться о том, чего вы пытаетесь достичь. Ошибка говорит, что нет атрибута с именем «Hello», поэтому, возможно, модули, которые вы пытаетесь протестировать, должны получить такую ​​переменную, функцию или что-то еще.

Есть ли причина, по которой вы не используете просто unittest.main () ?

-1
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: