繁体   English   中英

Python单元测试可运行多次

[英]Python unittests run multiple times

我有一个问题,我的某些单元测试可以多次运行,但是我不知道为什么。

这是带有测试的代码:

# -*- coding: utf-8 -*-
"""Tests for api.resource.decorators"""

import os
import errno
import unittest
import logging
from socket import gaierror, error as socketerror
from lockfile import LockFile
from logging import FileHandler, Formatter
from api.resource.decorators import handle_general_exceptions


class TestHandleGeneralExceptions(unittest.TestCase):
    _tmp_log_path = '/tmp/test_handle_general_exceptions_log'
    _tmp_lock_path = '/tmp/test_handle_general_exceptions_lock'
    _lock = None
    _logger = None

    def setUp(self):
        self._lock = self._get_lock()
        self._logger = self._get_logger()

    def tearDown(self):
        self._remove_lockfiles()

    def _remove_lockfiles(self):
        # TODO: solve without system call
        os.system('rm -f %s*' % self._tmp_lock_path)

    def _get_lock(self):
        return LockFile(self._tmp_lock_path)

    def _get_logger(self):
        logger = logging.getLogger('handle_general_exceptions')
        logger.propagate = False # Only use this Logger
        handler = FileHandler(self._tmp_log_path)
        formatter = Formatter('%(asctime)s [%(levelname)s] %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.setLevel('INFO')
        return logger

    def _raise_gaierror(self):
        self._lock.acquire(-1)
        raise gaierror(-2, 'Name or service not known')

    def _raise_connection_timed_out(self):
        self._lock.acquire(-1)
        raise socketerror(errno.ETIMEDOUT, 'Connection Timed Out')

    def _raise_connection_refused(self):
        self._lock.acquire(-1)
        raise socketerror(errno.ECONNREFUSED, 'Connection Refused')

    def _is_locked(self):
        return os.path.exists(self._tmp_lock_path + '.lock') == 1

    def test_not_locked_if_gaierror_occurred(self):
        self._raise_gaierror = handle_general_exceptions(
            self._lock, self._logger, self._raise_gaierror)
        self._logger.info('¯¯¯¯¯¯¯¯¯¯¯¯ _raise_gaierror() ¯¯¯¯¯¯¯¯¯¯¯¯')
        self._raise_gaierror()
        self._logger.info('____________ End _raise_gaierror() ____________')
        self.assertFalse(self._is_locked())

    def test_not_locked_if_connection_timed_out(self):
        self._raise_connection_timed_out = \
            handle_general_exceptions(self._lock, self._logger,
                self._raise_connection_timed_out)
        self._logger.info(
            '¯¯¯¯¯¯¯¯¯¯¯¯ _raise_connection_timed_out() ¯¯¯¯¯¯¯¯¯¯¯¯')
        self._raise_connection_timed_out()
        self._logger.info(
            '____________ End _raise_connection_timed_out() ____________')
        self.assertFalse(self._is_locked())

    def test_not_locked_if_connection_refused(self):
        self._raise_connection_refused = \
            handle_general_exceptions(self._lock, self._logger,
                self._raise_connection_refused)
        self._logger.info(
            '¯¯¯¯¯¯¯¯¯¯¯¯ _raise_connection_refused() ¯¯¯¯¯¯¯¯¯¯¯¯')
        self._raise_connection_refused()
        self._logger.info(
            '____________ End _raise_connection_refused() ____________')
        self.assertFalse(self._is_locked())

测试通过如下脚本执行:

#!/bin/sh

python -m unittest discover api.tests -t .

现在测试test_not_locked_if_gaierror_occurred()执行了3次。

测试test_not_locked_if_connection_timed_out()执行2次。

并且测试test_not_locked_if_connection_refused()执行一次。

那就是日志的输出:

2016-10-21 13:20:31 [INFO] ¯¯¯¯¯¯¯¯¯¯¯¯ _raise_connection_refused() ¯¯¯¯¯¯¯¯¯¯¯¯
2016-10-21 13:20:31 [ERROR] error: [Errno 111] Connection Refused
2016-10-21 13:20:31 [INFO] ____________ End _raise_connection_refused() ____________
2016-10-21 13:20:31 [INFO] ¯¯¯¯¯¯¯¯¯¯¯¯ _raise_connection_timed_out() ¯¯¯¯¯¯¯¯¯¯¯¯
2016-10-21 13:20:31 [INFO] ¯¯¯¯¯¯¯¯¯¯¯¯ _raise_connection_timed_out() ¯¯¯¯¯¯¯¯¯¯¯¯
2016-10-21 13:20:31 [ERROR] error: [Errno 110] Connection Timed Out
2016-10-21 13:20:31 [ERROR] error: [Errno 110] Connection Timed Out
2016-10-21 13:20:31 [INFO] ____________ End _raise_connection_timed_out() ____________
2016-10-21 13:20:31 [INFO] ____________ End _raise_connection_timed_out() ____________
2016-10-21 13:20:31 [INFO] ¯¯¯¯¯¯¯¯¯¯¯¯ _raise_gaierror() ¯¯¯¯¯¯¯¯¯¯¯¯
2016-10-21 13:20:31 [INFO] ¯¯¯¯¯¯¯¯¯¯¯¯ _raise_gaierror() ¯¯¯¯¯¯¯¯¯¯¯¯
2016-10-21 13:20:31 [INFO] ¯¯¯¯¯¯¯¯¯¯¯¯ _raise_gaierror() ¯¯¯¯¯¯¯¯¯¯¯¯
2016-10-21 13:20:31 [ERROR] gaierror: [Errno -2] Name or service not known
2016-10-21 13:20:31 [ERROR] gaierror: [Errno -2] Name or service not known
2016-10-21 13:20:31 [ERROR] gaierror: [Errno -2] Name or service not known
2016-10-21 13:20:31 [INFO] ____________ End _raise_gaierror() ____________
2016-10-21 13:20:31 [INFO] ____________ End _raise_gaierror() ____________
2016-10-21 13:20:31 [INFO] ____________ End _raise_gaierror() ____________

我自己发现了问题,测试没有运行多次。 日志输出奇怪的原因是,我在所有测试中都使用了相同的记录器。

我必须更改以下内容

def _get_logger(self):
   logger = logging.getLogger('handle_general_exceptions') 

像这样

def _get_logger(self, logger_suffix):
    logger = logging.getLogger('handle_general_exceptions' + logger_suffix)

这样,它仍然仅记录到一个文件,但是使用了不同的记录器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM