如何在涉及类数据的 python 类中测试顺序操作



>Background

我有一个类,它对数据执行相当缓慢、复杂的操作。我想为该类编写一些测试,但我很难找到合适的测试框架。

该类具有如下所示的接口:

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...

我们使用此类的方式是,我们通常按顺序执行操作并分析结果,通常在每一步,通常在 jupyter 笔记本中。

问题

应该如何测试具有此结构的类中的方法?是否有构建顺序测试套件的框架/约定?

我试过了。。。

  • 我尝试使用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)

最新更新