Тест носа script с аргументами командной строки
Я хотел бы иметь возможность запускать носовой тест script, который принимает аргументы командной строки. Например, что-то по строкам:
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)
По-видимому, нос пытается что-то сделать с аргументами, переданными в sys.argv. Есть ли способ сделать нос игнорировать эти аргументы?
Ответы
Ответ 1
Хорошо, я ненавижу "почему ты хочешь это сделать?" ответы так же, как и все, но я собираюсь сделать это здесь. Надеюсь, вы не против.
Я бы сказал, что делать то, что вы хотите сделать, не входит в рамки носа каркаса. Нос предназначен для автоматических испытаний. Если вам нужно передать аргументы командной строки для прохождения теста, то это не автоматизировано. Теперь вы можете сделать что-то вроде этого:
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, если вы хотите увидеть, что происходит на stdout)
Тем не менее, я бы, вероятно, по-прежнему рекомендовал против этого, поскольку, как правило, это плохая идея возиться с глобальным состоянием в автоматизированных тестах, если вы можете избежать этого. То, что я, скорее всего, сделаю, - это адаптировать любой код, который я хочу проверить, чтобы взять список argv
. Затем вы можете пройти все, что захотите во время тестирования, и пройти в sys.argv
в процессе производства.
UPDATE
Причина, по которой мне нужно это сделать потому что я тестирую несколько реализации одной и той же библиотеки. Для проверки этих реализаций правильно я использую один нос script, который принимает в качестве командной строки аргумент библиотеки, что она должна импорт для тестирования.
Похоже, вы захотите попробовать свои силы при написании плагина с носом. Это довольно легко сделать. Ниже приведены последние документы.
Ответ 2
Вы могли бы использовать еще один способ получить материал в свой код:
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
Затем просто запомните настройку среды перед запуском носа.
Ответ 3
Я думаю, что это вполне приемлемый сценарий. Мне также нужно было сделать что-то подобное для запуска тестов по различным сценариям (dev, qa, prod и т.д.), И мне нужны были правильные URL-адреса и конфигурации для каждой среды.
Решение, которое я нашел, заключалось в использовании плагина носа-testconfig (
Ответ 4
В настоящее время я использую следующий хак:
args = sys.argv[1:]
sys.argv = sys.argv[0:1]
который просто считывает аргумент в локальную переменную и затем удаляет все дополнительные аргументы в sys.argv
, чтобы нос не смущался ими.
Ответ 5
Простое ношение носа и прохождение параметров не будут работать, так как нос попытается интерпретировать аргументы как параметры носа, чтобы вы получили проблемы, которые вы видите.
Я не думаю, что параметр поддержки носа поддерживается прямо, но этот плагин для носа 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