如何在涉及 class 数据的 python class 中测试顺序操作
How to test sequential operations in a python class involving class data
背景
我有一个 class,它对数据执行相当缓慢、复杂的操作。我想为此编写一些测试 class,但我很难找到合适的测试框架。
class有一个这样的界面:
class thing():
def __init__(self, datafile):
data = read datafile
def a(self):
self.data_a = expensive(self.data)
def b(self):
self.data_b = expensive(self.data_a)
def c(self):
self.data_c = expensive(self.data_b)
etc...
我们使用这个 class 的方式是我们通常按顺序执行操作并分析结果,通常在每一步,通常在 jupyter notebook 中。
问题
如何测试具有这种结构的class中的方法?是否有构建顺序测试套件的框架/约定?
我试过了...
我尝试使用 pytest,像这样:
@pytest.mark.incremental
class Test_thing(object):
def setUp(self):
generated_data = generate(data)
generated_data.write(somewhere)
self.t = thing(somewhere)
def test_a(self):
self.t.a()
assert self.t.data_a hasProperties
def test_b(self):
self.t.b()
assert self.t.data_b hasProperties
但是 test_b
会失败并显示 data_a is not an attribute of thing
这是 pytest 的一个特性,而不是一个错误:测试彼此隔离运行。但我想要相反的东西。
我前段时间也尝试过 unittest,但找不到在那个框架中表达我的测试的方法。
目前我写的测试都是没有测试框架的,基本上就是上面的pytest代码,没有pytest引用,最后:
t = Test_thing()
t.setUp()
t.test_a()
t.test_b()
...
这是我能做的最好的了吗?
备注
我也在为这个问题寻找更好的标题的建议
也许您可以考虑使用 unitest
包中的 subtest
功能:
import unittest
class TestExpensive(unittest.TestCase):
def setUp(self):
generated_data = generate(data)
generated_data.write(somewhere)
self.t = thing(somewhere)
def test_abc(self):
with self.subTest(status_code='a'):
self.t.a()
# Verify self.t.data_a has required properties
self.assertTrue(True)
with self.subTest(status_code='b'):
self.t.b()
# Verify self.t.data_b has required properties
self.assertTrue(False)
您可以将所有昂贵的函数调用放在一个测试中,这样您就可以在测试过程中重用任何中间结果。此外,如果发生错误,您仍然可以通过 status_code
变量将其追溯到导致问题的子测试:
======================================================================
FAIL: test_abc (__main__.TestExpensive) (status_code='b')
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 17, in test_abc
self.assertTrue(False)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
背景
我有一个 class,它对数据执行相当缓慢、复杂的操作。我想为此编写一些测试 class,但我很难找到合适的测试框架。
class有一个这样的界面:
class thing():
def __init__(self, datafile):
data = read datafile
def a(self):
self.data_a = expensive(self.data)
def b(self):
self.data_b = expensive(self.data_a)
def c(self):
self.data_c = expensive(self.data_b)
etc...
我们使用这个 class 的方式是我们通常按顺序执行操作并分析结果,通常在每一步,通常在 jupyter notebook 中。
问题
如何测试具有这种结构的class中的方法?是否有构建顺序测试套件的框架/约定?
我试过了...
我尝试使用 pytest,像这样:
@pytest.mark.incremental class Test_thing(object): def setUp(self): generated_data = generate(data) generated_data.write(somewhere) self.t = thing(somewhere) def test_a(self): self.t.a() assert self.t.data_a hasProperties def test_b(self): self.t.b() assert self.t.data_b hasProperties
但是
test_b
会失败并显示data_a is not an attribute of thing
这是 pytest 的一个特性,而不是一个错误:测试彼此隔离运行。但我想要相反的东西。我前段时间也尝试过 unittest,但找不到在那个框架中表达我的测试的方法。
目前我写的测试都是没有测试框架的,基本上就是上面的pytest代码,没有pytest引用,最后:
t = Test_thing() t.setUp() t.test_a() t.test_b() ...
这是我能做的最好的了吗?
备注
我也在为这个问题寻找更好的标题的建议
也许您可以考虑使用 unitest
包中的 subtest
功能:
import unittest
class TestExpensive(unittest.TestCase):
def setUp(self):
generated_data = generate(data)
generated_data.write(somewhere)
self.t = thing(somewhere)
def test_abc(self):
with self.subTest(status_code='a'):
self.t.a()
# Verify self.t.data_a has required properties
self.assertTrue(True)
with self.subTest(status_code='b'):
self.t.b()
# Verify self.t.data_b has required properties
self.assertTrue(False)
您可以将所有昂贵的函数调用放在一个测试中,这样您就可以在测试过程中重用任何中间结果。此外,如果发生错误,您仍然可以通过 status_code
变量将其追溯到导致问题的子测试:
======================================================================
FAIL: test_abc (__main__.TestExpensive) (status_code='b')
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 17, in test_abc
self.assertTrue(False)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)