Скрипт проверки носа с аргументами командной строки - PullRequest
15 голосов
/ 02 ноября 2009

Я хотел бы иметь возможность запустить скрипт проверки носа, который принимает аргументы командной строки. Например, что-то вроде:

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 Есть ли способ заставить нос игнорировать эти аргументы?

Ответы [ 5 ]

17 голосов
/ 02 ноября 2009

Хорошо, я ненавижу "зачем тебе это делать?" отвечает так же, как и любой другой, но я собираюсь сделать один здесь. Надеюсь, ты не возражаешь.

Я бы сказал, что делать то, что вы хотите, не входит в сферу фреймворка. Нос предназначен для автоматизированных тестов. Если вам нужно передать аргументы командной строки для прохождения теста, то он не автоматизирован. Теперь то, что вы можете сделать, выглядит примерно так:

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

Причина, по которой мне нужно это сделать, потому что я тестирую несколько реализации той же библиотеки. Чтобы проверить эти реализации правильно, я использую сценарий с одним носом который принимает в качестве командной строки аргумент библиотеки, что он должен импорт для тестирования.

Похоже, вы можете попробовать свои силы в написании плагина для носа. Это довольно легко сделать. Вот последние документы.

11 голосов
/ 30 апреля 2013

Вы можете использовать другое средство для вставки кода в ваш код:

import os

print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)

Тогда просто не забудьте установить свое окружение, прежде чем насморк.

7 голосов
/ 01 апреля 2015

Я думаю, что это вполне приемлемый сценарий. Мне также нужно было сделать что-то похожее, чтобы запустить тесты для разных сценариев (dev, qa, prod и т. Д.), И там мне были нужны правильные URL и конфигурации для каждой среды.

Решение, которое я нашел, заключалось в использовании плагина nose-testconfig (ссылка здесь ). Это не совсем передача аргументов командной строки, но создание файла конфигурации со всеми вашими параметрами, а затем передача этого файла конфигурации в качестве аргумента при выполнении ваших тестов на нос.

Файл конфигурации имеет следующий формат:

[group1]
env=qa

[urlConfig]
address=http://something

[dbConfig]
user=test
pass=test

И вы можете прочитать аргументы, используя:

from testconfig import config

print(config['dbConfig']['user'])
3 голосов
/ 12 ноября 2009

Пока я использую следующий хак:

args = sys.argv[1:]
sys.argv = sys.argv[0:1]

, который просто считывает аргумент в локальную переменную, а затем удаляет все дополнительные аргументы в sys.argv, чтобы они не смутили нос.

2 голосов
/ 02 ноября 2009

Просто запустить нос и передать параметры не будет работать, поскольку нос попытается интерпретировать аргументы как параметры носа, чтобы вы могли увидеть проблемы, которые вы видите.

Я не думаю, что поддержка носителей передается напрямую, но этот плагин носа 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
...