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がまったく設定されていません(check_function()が何を返してもFalseのままです)。

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 を 1 回設定する方法のアイデアはありますか?

編集: check_function() は確かに 1 回呼び出されますが、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

あなたの2番目のアプローチは出発点のように見えます。しかし、タイミングの問題が発生しています。

一方では、デコレータを適用するときにその値が存在するようにします (これは非常に早い段階です)。一方、 を呼び出すときに設定します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 に答える