Тестовый скрипт Nose с аргументами командной строки

StackOverflow https://stackoverflow.com/questions/1660520

Вопрос

Я хотел бы иметь возможность запустить тестовый скрипт 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top