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

标签 python pytest python-unittest

背景

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

该类具有如下接口(interface):

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 Notebook 中按顺序执行操作并分析结果,通常是在每一步中。

问题

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

我尝试过...

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

关于python - 如何测试涉及类数据的 python 类中的顺序操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50841845/

相关文章:

python - 如何序列化递归函数?

python - 如何使用 Python 和 Pytest 比较和测试字典列表中的特定键

python - Django py.test 在真实数据库上运行?

python - pytest:如何使用标记注入(inject) fixture ?

python - 是否可以修补在另一个类中调用的方法?

python - 如果测试失败则显示实际值

python - 将文本从字典优先级替换为更长的字符串

python - 将长 xticks 分成 2 行 matplotlib

python - 比较行中的元素

python - 如何在单元测试中使用 JSON 发送请求