Python:基于是否运行nosetest的条件变量

8 投票
2 回答
1740 浏览
提问于 2025-04-17 01:44

我正在运行nosetests,这些测试有一个设置函数,需要加载一个与生产环境不同的数据库。我使用的ORM是peewee,它要求在模型定义时就设置数据库。

所以我需要设置一个条件变量,但我不知道该用什么条件来检查nosetest是否正在运行这个文件。

我在Stack Overflow上看到可以通过检查sys.modules中的nose来判断,但我在想有没有更准确的方法来确认nose是否在运行。

2 个回答

1

查看 sys.argv 可能有用,但你可以用 nosetestspython -m nose 来执行 nose,这两种方式显然会得到不同的结果。

我认为更稳妥的方法是检查调用栈,看看代码是否是通过一个叫 nose 的包来调用的。

示例代码:

import inspect
import unittest


def is_called_by_nose():
    stack = inspect.stack()
    return any(x[0].f_globals['__name__'].startswith('nose.') for x in stack)


class TestFoo(unittest.TestCase):
    def test_foo(self):
        self.assertTrue(is_called_by_nose())

示例用法:

$ python -m nose test_caller
.
----------------------------------------------------------------------
Ran 1 test in 0.009s

OK
$ nosetests test_caller
.
----------------------------------------------------------------------
Ran 1 test in 0.009s

OK
$ python -m unittest test_caller
F
======================================================================
FAIL: test_foo (test_caller.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_caller.py", line 14, in test_foo
    self.assertTrue(is_called_by_nose())
AssertionError: False is not true

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (failures=1)
10

也许可以查看一下 sys.argv[0],看看正在运行的是什么命令?

撰写回答