Тест носа 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