Тестовый скрипт Nose с аргументами командной строки
-
11-09-2019 - |
Вопрос
Я хотел бы иметь возможность запустить тестовый скрипт nose, который принимает аргументы командной строки.Например, что-то вроде:
test.py
import nose, sys
def test():
# do something with the command line arguments
print sys.argv
if __name__ == '__main__':
nose.runmodule()
Однако всякий раз, когда я запускаю это с аргументом командной строки, я получаю сообщение об ошибке:
$ python test.py arg
E
======================================================================
ERROR: Failure: ImportError (No module named arg)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 368, in loadTestsFromName
module = resolve_name(addr.module)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/util.py", line 334, in resolve_name
module = __import__('.'.join(parts_copy))
ImportError: No module named arg
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
По-видимому, nose пытается что-то сделать с аргументами, переданными в sys.argv.Есть ли способ заставить nose игнорировать эти аргументы?
Решение
Ладно, я ненавижу ответы на вопрос "зачем тебе это нужно?" так же сильно, как и все остальные, но мне придется сделать это здесь.Надеюсь, ты не возражаешь.
Я бы сказал, что делать все, что вы хотите, не входит в рамки фреймворка nose.Нос предназначен для автоматизированный тесты.Если вам нужно передать аргументы командной строки для прохождения теста, то это не автоматизировано.Итак, что вы может сделать это что-то вроде этого:
import sys
class test_something(object):
def setUp(self):
sys.argv[1] = 'arg'
del sys.argv[2] # remember that -s is in sys.argv[2], see below
def test_method(self):
print sys.argv
Если вы запустите это, вы получите следующий результат:
[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(Не забудьте передать флаг -s, если вы хотите увидеть, что происходит в стандартном режиме)
Тем не менее, я бы, вероятно, все же рекомендовал отказаться от этого, поскольку, как правило, не стоит связываться с глобальным состоянием в автоматических тестах, если вы можете этого избежать.Что я, скорее всего, сделал бы, так это адаптировал бы любой код, который я хочу протестировать, чтобы argv
Список.Затем вы можете ввести все, что захотите, во время тестирования и пройти sys.argv
в процессе производства.
Обновить:
Причина, по которой мне нужно это сделать, заключается в том, что я тестирую несколько реализаций одной и той же библиотеки.Для тестирования тех реализаций правильно я использую один скрипт нос, что можно в командной строке аргумент библиотеке, что она должна импорт для тестирования.
Похоже, вы, возможно, захотите попробовать свои силы в написании плагина nose.Это довольно легко сделать. Вот последние документы.
Другие советы
Вы могли бы использовать другой способ внесения информации в свой код:
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
Тогда просто не забудьте настроить свое окружение, прежде чем насморкаться.
Я думаю, что это вполне приемлемый сценарий.Мне также нужно было сделать что-то подобное, чтобы запускать тесты по разным сценариям (dev, qa, prod и т.д.), И там мне нужны были правильные URL-адреса и конфигурации для каждой среды.
Решение, которое я нашел, состояло в том, чтобы использовать нос-testconfig плагин (ссылка здесь).Это не совсем передача аргументов командной строки, но создание конфигурационного файла со всеми вашими параметрами, а затем передача этого конфигурационного файла в качестве аргумента при выполнении ваших nose-тестов.
Конфигурационный файл имеет следующий формат:
[group1]
env=qa
[urlConfig]
address=http://something
[dbConfig]
user=test
pass=test
И вы можете прочитать аргументы, используя:
from testconfig import config
print(config['dbConfig']['user'])
На данный момент я использую следующий хак:
args = sys.argv[1:]
sys.argv = sys.argv[0:1]
который просто считывает аргумент в локальную переменную, а затем удаляет все дополнительные аргументы в sys.argv
чтобы нос не запутался в них.
Просто запустить nose и передать параметры не сработает, так как nose попытается интерпретировать аргументы как параметры nose, поэтому вы получите проблемы, которые вы видите.
Я не думаю, что nose поддерживает передачу параметров напрямую, но этот подключаемый модуль nose нос-testconfig Позволяет вам писать тесты, подобные приведенным ниже:
from testconfig import config
def test_os_specific_code():
os_name = config['os']['type']
if os_name == 'nt':
pass # some nt specific tests
else:
pass # tests for any other os