Как сообщить Python unittest, чтобы он вышел с пользовательским кодом, установленным в функции

Как заставить Python unittest выйти из моей функции с кодом состояния?

В моей функции tearDown мне нужно выполнить некоторую обработку, чтобы сгенерировать код состояния, но я хотел бы, чтобы unittest завершала работу с этим кодом. Сценарий Python будет запускаться из bat-файла DOS и должен отображать %ERRORLEVEL%, и я хочу, чтобы %ERRORLEVEL% был установлен с myExitCode.

В настоящее время он всегда возвращает 0:

import logging
import unittest
import sys

myExitCode = 0

class MyTest(unittest.TestCase):

    def setUp(self):
        logging.info('Setting up test: logged stdout')

    def test(self):
        logging.info('logged more stdout')
        self.assertTrue(True)

    def tearDown(self):
        ## Mocking some processing to generate a customized exit code:
        myExitCode = 1000
        logging.info('exit code = %d', myExitCode)
        return myExitCode

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger()
    logger.addHandler(logging.FileHandler('test.log', mode='a'))
    stderr_file = open('test.log', 'a')
    unittest.main(testRunner=unittest.TextTestRunner(stream=stderr_file), exit=False)
    logging.info('Exit Code from main: %d', myExitCode)
    sys.exit(myExitCode)

Пакетный скрипт:

python myExitCode.py
echo %ERRORLEVEL%

person user2766739    schedule 29.01.2014    source источник
comment
Можете ли вы опубликовать соответствующий код пакетного файла, который вы используете для вызова скрипта Python?   -  person unclemeat    schedule 29.01.2014
comment
Я добавил содержимое пакетного сценария.   -  person user2766739    schedule 29.01.2014


Ответы (1)


Здесь вам нужно использовать глобальную переменную. Имейте в виду, что это не очень чисто:

   def tearDown(self): 
        global myExitCode
        myExitCode = 1000
        logging.info('exit code = %d', myExitCode)
person Thomas Orozco    schedule 29.01.2014
comment
Спасибо, Томас, теперь это работает для меня. Да, он не очищен, но это система, с которой мне приходится работать. К сожалению, модульный тест сообщает об ошибке, потому что я должен выйти с пользовательским кодом выхода. :( - person user2766739; 31.01.2014
comment
Чем объяснить то, что произошло без глобал? Можно добавить к ответу. - person Peter Mortensen; 29.11.2020