2

我有一个如下所示的模块 A:

import unittest2

def check_function():
    # performs actions and returns True or False
    return smth

CHECK = check_function()

class A(unittest2.TestCase):

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check

模块 A 正在由另一个模块 B 导入。全局变量 CHECK 何时初始化?进口时?在类实例化?

每次调用 A 类时,我都需要设置 CHECK 变量。我怎样才能做到这一点?

编辑:我已经尝试了以下(这可能是我正在寻找的),但是在 setUpClass 中根本没有设置 CHECK(它保持 False,无论 check_function() 返回什么)。

import unittest2

def check_function():
    # performs actions and returns True or False
    return smth

CHECK = False

class A(unittest2.TestCase):

    global CHECK

    @classmethod
    def setUpClass(cls):
        CHECK = check_function()

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check

每次调用测试时如何设置一次 CHECK 的任何想法?

编辑: check_function() 肯定被调用一次,但我不明白为什么 unittest2.skipIf 没有“看到” setUpClass 中设置的值,而是坚持声明时设置的 False 值?

解决方案:

代码的最终骨架如下所示:

import unittest2

def check_function():
    # performs checks and returns True or False
    return smth

class A(unittest2.TestCase):

    CHECK = check_function()

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # do tests
        self.assertTrue(True)

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_2(self):
        # do tests
        self.assertTrue(True)
4

3 回答 3

2

CHECK一次导入模块时变量已初始化。

见例子。我有一个模块mymodule.py,其中包含:

print "i am mymodule"

还有一些anothermodule.py

print "first"

import mymodule

print "second"

import mymodule

print "third"

当我跑步时,another module.py我得到:

first
i am mymodule
second
third

python中的初始化变量是相同的命令,print并且将在解释器第一次出现在您的模块中时逐行执行。

更清楚的例子。

mymodule.py

def get_a():
    print 'init a'
    return 42

def get_b():
    print 'init b'
    return 20

a = get_a()
b = get_b()

anothermodule.py

from mymodule import a
print "a =", a
print "b =", b

结果:

init a
init b
a = 42
Traceback (most recent call last):
  File "anothermodule.py", line 3, in <module>
    print b
NameError: name 'b' is not defined
于 2012-10-11T11:08:58.100 回答
1

您的第二种方法看起来像是一个起点。但是你遇到了时间问题。

一方面,您希望在应用装饰器时出现该值(这很早),另一方面,您在调用setUpClass(). 那可能已经很晚了。

在我看来唯一的选择

class A(unittest2.TestCase):
    CHECK = check_function()

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check

whereCHECK比使用早初始化。

于 2012-10-11T11:50:13.133 回答
0

那这个呢:

import unittest2

def check_function():
  # performs actions and returns True or False
  return smth

CHECK = None

class A(unittest2.TestCase):
    def __init__(self,*args,**kwargs):
        CHECK=check_funtion
        super(A,self).__init__(*args,**kwargs)

    @unittest2.skipIf(CHECK, "skip message 1")
    def test_1(self):
        # test check

    @unittest2.skipIf(CHECK, "skip message 2")
    def test_2(self):
        # test check
于 2012-10-11T11:50:23.697 回答