Как я могу удалить аргументы CLI, используя argparse, чтобы unittest принимал список arg - PullRequest
0 голосов
/ 09 мая 2019

Я бы хотел передать свои собственные аргументы в файлы, которые настроены для unittest.Поэтому вызов его из командной строки должен работать следующим образом:

python Misc / Test.py --c keith.ini SomeTests.test_one

В настоящее время я сталкиваюсь с двумя проблемами.

1) Анализ аргументов не допускает неизвестных аргументов

использование: Test.py [-h] [--c CONFILE] Test.py: ошибка: нераспознанные аргументы: SomeTests.test_one

2) Модульный тест не допускает неизвестных аргументов.Поэтому --c fileName не принимается unittest и возвращает:

AttributeError: у объекта 'module' нет атрибута 'keith'

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

import unittest
import argparse

myArgs = None

def getArgs( allArgs ):
    parser = argparse.ArgumentParser( )
    parser.add_argument('--c', dest='conFile', type=str, default=None, help='Config file')
    args = parser.parse_args()

    if ( args.conFile == None ):
        parser.print_help()

    return args


class SomeTests(unittest.TestCase):
    def test_one(self):
        theTest( 'keith' )

    def test_two(self):
        otherTest( 'keith' )

if __name__ == '__main__':
    myArgs = getArgs( sys.argv )
    print 'Config File: ' + myArgs.conFile
    unittest.main( argv=sys.argv, testRunner = unittest.TextTestRunner(verbosity=2))

Интересно, я только что нашел parse_known_args (), поэтому я изменил строку разбора на:

args = parser.parse_known_args(['--c']). 

Я подумал, что это решит мою проблему и даст мне кое-что для передачимодульный тест.К сожалению, я получаю:

Test.py: error: argument --c: expected one argument. 

Разве это не должно работать?

1 Ответ

0 голосов
/ 10 мая 2019

ОК, немного усилий, но понял. Это вполне возможно. Документация для argparse не верна. Функция parse_known_args () не должна включать список известных аргументов. Также argparse удаляет arg [0], который важно возвращать, чтобы другие команды видели действительный список аргументов. Я бы посчитал это удаление ошибкой. Я включил последний пример кода. Как только вы сохраните это в файл, вы можете назвать его, как в примерах ниже, и все будет работать.

python Misc/Test.py                     # Requires config file
python Misc/Test.py --c keith.ini       # Runs all tests
python Misc/Test.py --c keith.ini SomeTests          # Runs Class
python Misc/Test.py --c keith.ini SomeTests.test_one # Runs test

import unittest
import argparse

myArgs = None

def getArgs( allArgs ):
    parser = argparse.ArgumentParser( )
    parser.add_argument('--c', dest='conFile', type=str, default=None, help='Configuration file. (Required)')
    args, addArgs = parser.parse_known_args( )

    if ( args.conFile == None ):
        parser.print_help()
        sys.exit(2)

    # argparse strips argv[0] so prepend it
    return args, [ sys.argv[0]] + addArgs

def verify( expected, actual ):
    assert expected == actual, 'Test Failed: '

# Reusable Test
def theTest( exp ):
    print 'myargs: ' + str( myArgs )
    verify( exp, 'keith' )

def otherTest( exp ):
    theTest( exp )

class SomeTests(unittest.TestCase):
    def test_one(self):
        theTest( 'keith' )

    def test_two(self):
        otherTest( 'keith2' )

if __name__ == '__main__':
    myArgs, addArgs = getArgs( sys.argv )
    unittest.main( argv=addArgs, testRunner = unittest.TextTestRunner(verbosity=2))

HTH, Наслаждайтесь

...