Во время тестирования юнитов не позволяйте регистратору печатать на консоль - PullRequest
0 голосов
/ 22 декабря 2018

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

Моя структура программы:

Project
- Components
 |  - __init__.py
 |  - mathtoolbox.py
- Tests
 |  - __init__.py
 |  - test_mathtoolbox.py
__main__.py
- Logs
 |  - logfile.log

В mathtoolbox.py, скажем, у меня есть функция div, в которой есть попытка, за исключением ZeroDivisionError, и при ее обнаружении выдается ошибкатолько файл журнала (ни один из журналов не должен быть напечатан на консоли).Код из трех файлов * .py приведен ниже

__main__.py настраивает регистратор и запускает функцию деления.

def main():
    X = mathtoolbox.divide(5, 0)
    print(X)


if __name__ == '__main__':
    import logging
    root_logger = logging.getLogger()
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)-8s - [%(module)-15s]: %(message)s when running %(funcName)s')
    handler = logging.FileHandler("Logs/logfile.log")
    handler.setFormatter(formatter)
    root_logger.setLevel(logging.DEBUG)
    root_logger.addHandler(handler)

    root_logger.info("Code has initiated the logger from " + __name__)

    main()

mathtoolbox.py имеет:

import logging
logger = logging.getLogger(__name__)

def divide(x, y):
    logger.info("An INFO message from " + __name__)
    try:
        return x / y
    except ZeroDivisionError:
        logger.error(
            "An ERROR message from " + __name__)

и test_mathtoolbox.py имеет:

import unittest
import Components.mathtoolbox as mathtoolbox


class Test(unittest.TestCase):

    def test_divide_when_zero(self):
        self.assertRaises(ZeroDivisionError, mathtoolbox.divide(5, 0))

    def test_divide(self):
        result = mathtoolbox.divide(6, 2)
        self.assertEqual(result, 3)


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

Когда main работает нормально, он выполняетименно так, как я хотел бы, чтобы консоль показывала только результат оператора печати с делением, а файл журнала правильно отображал все, что было зарегистрировано.Однако при модульном тестировании «test_divide_when_zero» выведет на консоль «сообщение об ошибке из Components.mathtoolbox», которое мне не нужно, потому что этот модульный тест уже подтвердил исключение, и поэтому это сообщение об ошибке не нужно.Я понимаю, что это потому, что ничего из main еще не запущено для настройки регистратора.Так есть ли способ настроить регистратор при модульном тестировании, чтобы он не печатался на консоли, или есть более разумная платформа для решения всей этой проблемы?

Спасибо вам!

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