Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在涉及类数据的python类中测试顺序操作 背景_Python_Pytest_Python Unittest - Fatal编程技术网

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

如何在涉及类数据的python类中测试顺序操作 背景,python,pytest,python-unittest,Python,Pytest,Python Unittest,我有一个类,它对数据执行相当缓慢、复杂的操作。我想为那个类编写一些测试,但我很难找到合适的测试框架 该类具有如下接口: 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(

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

该类具有如下接口:

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\u b
    会因
    数据而失败。a不是事物的属性,而这是pytest的一个特性,而不是bug:测试彼此独立运行。但我想要相反的结果

  • 不久前我也尝试过unittest,但找不到在该框架中表达测试的方法

  • 目前,我编写的测试没有测试框架,基本上是上面的pytest代码,没有pytest引用,最后:

    t = Test_thing()
    t.setUp()
    t.test_a()
    t.test_b()
    ...
    
    这是我能做的最好的了吗

笔记
我也在寻找一个关于这个问题更好的标题的建议

也许你可以考虑使用<代码>子测试< /Case>特性在<代码> UNITEST 包:

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\u 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)

昂贵(x)会改变x吗?如果不是,为什么不运行setUp()中的所有t.a()、t.b()等?昂贵(x)不会改变x。我想测试每个单独的函数——如果我想测试t.b(),为什么要在setup()中测试t.b()?好的一点,加上我错过了计算速度慢的部分。也许这个答案会有帮助:为什么不在一个函数中测试它们,因为它们彼此依赖。在一个测试中可以有多个断言。或者,您可以模拟昂贵函数的结果,并将其输入到其他函数中。