2017-02-06 1 views
0

У меня есть следующий блок кода в моем модуле,Как игнорировать блок кода Python из модульных тестов?

PARSER = argparse.ArgumentParser(description='This script gets ELB statistics ' 
              'and look for any failed instances') 
PARSER.add_argument('--profile', help='AWS profile - optional (only if multiple ' 
             'accounts are setup in credentials file)', default='') 
PARSER.add_argument('--region', help='AWS region. Defaults to ap-southeast-2', 
        default='ap-southeast-2') 
PARSER.add_argument('--elb', help='DNS Name of the ELB to test', required=True) 
PARSER.add_argument('--start', help='Start time of the load test (YYYY-MM-DD HH:MM:SS)', 
        required=True) 
PARSER.add_argument('--end', help='End time of the load test (YYYY-MM-DD HH:MM:SS)', 
        required=True) 
PARSER.add_argument('--debug', help='Print debugging information', action='store_true') 

ARGS = PARSER.parse_args() 

PROFILE = ARGS.profile 
REGION = ARGS.region 
ELB = ARGS.elb 
START_TIME = format_date_string(ARGS.start) 
END_TIME = format_date_string(ARGS.end) 
DEBUG = ARGS.debug 

if (START_TIME and END_TIME) is not None and START_TIME < END_TIME: 
    ASG_MON = ASGMonitor(elb_dns_name=ELB, profile_name=PROFILE, region_name=REGION, debug=DEBUG) 
    # used not keyword so the script exits with status 0 when function returns True (success) 
    exit(not ASG_MON.analyse_elb_for_failed_nodes(START_TIME, END_TIME)) 
else: 
    cprint('Error - Bad start and end date/time input') 
    exit(1) 

Я только хочу, чтобы включить класс ASGMonitor в моих модульных тестов (в том же файле). Однако argparse вызывает проблемы с моим тестам,

py.test --cov elb_monitoring тест --cov обанкротиться-под 80---cov доклада термин пропущенного

И я получение ошибки,

========================================================================================== test session starts =========================================================================================== 
platform darwin -- Python 2.7.12, pytest-3.0.6, py-1.4.32, pluggy-0.4.0 
rootdir: /Users/achinthag/Documents/Git_Workspace/ea-gatling/elb_monitoring, inifile: 
plugins: cov-2.4.0 
collected 0 items/1 errors 


---------- coverage: platform darwin, python 2.7.12-final-0 ---------- 
Name        Stmts Miss Cover Missing 
----------------------------------------------------------------- 
src/elb_monitoring/__init__.py   0  0 100% 
src/elb_monitoring/elb_monitor.py  87  65 25% 15-17, 22-26, 35-49, 53-55, 61-70, 74-90, 94-111, 129-142 
----------------------------------------------------------------- 
TOTAL         87  65 25% 

================================================================================================= ERRORS ================================================================================================= 
_______________________________________________________________________________ ERROR collecting test/test_elb_monitor.py ________________________________________________________________________________ 
test/test_elb_monitor.py:3: in <module> 
    from elb_monitoring.elb_monitor import * 
src/elb_monitoring/elb_monitor.py:127: in <module> 
    ARGS = PARSER.parse_args() 
/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py:1701: in parse_args 
    args, argv = self.parse_known_args(args, namespace) 
/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py:1733: in parse_known_args 
    namespace, args = self._parse_known_args(args, namespace) 
/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py:1957: in _parse_known_args 
    self.error(_('argument %s is required') % name) 
/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py:2374: in error 
    self.exit(2, _('%s: error: %s\n') % (self.prog, message)) 
/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py:2362: in exit 
    _sys.exit(status) 
E SystemExit: 2 
-------------------------------------------------------------------------------------------- Captured stderr --------------------------------------------------------------------------------------------- 
usage: py.test [-h] [--profile PROFILE] [--region REGION] --elb ELB --start 
       START --end END [--debug] 
py.test: error: argument --elb is required 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
======================================================================================== 1 error in 0.61 seconds ========================================================================================= 

Как я могу игнорировать этот бит кода из тестов?

Спасибо,

+0

Возможный дубликат [Что делает, если \ _ \ _ name \ _ \ _ == "\ _ \ _ main \ _ \ _": do?] (Http://stackoverflow.com/questions/419163/what-does -if-name-main-do) – spectras

+0

@spectras Это сообщение в ссылке не имеет ничего общего с тем, что просит ОП. – karthikr

+0

@karthikr> извините, не нашел точно, что я искал, но хотел связать тот, который появился, потому что причина, по которой он не находит способ пропустить блок кода, определенно происходит от того, что этот код прямо в модуле , а не в функции с надлежащим условным исполнением. – spectras

ответ

2

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

def parse_args(args): 
    PARSER = argparse.ArgumentParser(description='This script gets ELB statistics ' 
               'and look for any failed instances') 
    PARSER.add_argument('--profile', help='AWS profile - optional (only if multiple ' 
              'accounts are setup in credentials file)', default='') 
    PARSER.add_argument('--region', help='AWS region. Defaults to ap-southeast-2', 
         default='ap-southeast-2') 
    PARSER.add_argument('--elb', help='DNS Name of the ELB to test', required=True) 
    PARSER.add_argument('--start', help='Start time of the load test (YYYY-MM-DD HH:MM:SS)', 
         required=True) 
    PARSER.add_argument('--end', help='End time of the load test (YYYY-MM-DD HH:MM:SS)', 
         required=True) 
    PARSER.add_argument('--debug', help='Print debugging information', action='store_true') 

    parsed_args = PARSER.parse_args() 
    return parsed_args 

def mymethod(ARGS): 
    PROFILE = ARGS.profile 
    REGION = ARGS.region 
    ELB = ARGS.elb 
    START_TIME = format_date_string(ARGS.start) 
    END_TIME = format_date_string(ARGS.end) 
    DEBUG = ARGS.debug 

    if (START_TIME and END_TIME) is not None and START_TIME < END_TIME: 
     ASG_MON = ASGMonitor(elb_dns_name=ELB, profile_name=PROFILE, region_name=REGION, debug=DEBUG) 
     # used not keyword so the script exits with status 0 when function returns True (success) 
     exit(not ASG_MON.analyse_elb_for_failed_nodes(START_TIME, END_TIME)) 
    else: 
     cprint('Error - Bad start and end date/time input') 
     exit(1) 

args = parse_args(sys.argv[1:]) 
mymethod(args) 

Теперь вы можете проверить свой mymethod. Обратите внимание, что args до mymethod является объектом argsnamespace. Если вы решите, вы можете разделить отдельные элементы и отправить их в качестве аргументов в метод.

0

При импорте модуля он выполняется. Вот как работает python. Определение класса действительно выполняется, когда код для класса «запущен».

Итак, можете ли вы определить класс и импортировать его, но пропустить выполнение другого кода? Да. Это очень распространенный трюк, который я связывал ранее. Это делается так:

# everything that needs to be accessed when importing 
# for instance, your 
class ASGMonitor(object): 
    # your stuff here 

# Th never put your main program code directly 
# in the module, create a function for this: 
def main(): 
    # put code that must not be run when importing here 

# Step 2 : only run main if your module is run directly 
# but not if it is imported: 
if __name__ == '__main__': 
    main() 

Когда модуль импортируется, __name__ это его имя. Когда модуль запускается напрямую, он имеет специальное имя __main__, факт, который мы используем в наших интересах. Код в вашей функции main не будет запущен при импорте вашего модуля ... например, когда вы будете тестировать ваш класс ASGMonitor.

См. this question для более подробного объяснения.

0

У вас уже есть хорошие ответы, но до сих пор не существует более общей части.

Дело в том, что для выгода от модульных испытаний; ваш код должен быть хорошо организован в независимым единиц. Самым первым ориентиром здесь будет Single Responsibility Principle!

Другими словами: вы не делаете все в одном модуле или одном методе/функции; вместо этого вы стремитесь к противоположному этому. Вы создаете один класс/метод/функцию (которая действительно зависит от того, сколько OO вы хотите использовать), который изолирует обработку аргументов. Вы создаете один класс/метод/функцию, проверяющий анализируемый вход; и так далее.

И затем вы тестируете каждый из этих единиц отдельно; изолированы друг от друга.