使用“setUp”和“tearDown”的不同实现unittest.TestCase实例

2024-10-01 04:58:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在不同的条件下运行一组测试,因此在两个不同的TestCase派生类之间共享这些测试。 一个创建自己的独立会话,另一个附加到现有会话并在其中执行相同的测试。在

我想我在用unittest框架测试一个API的时候有点滥用了它,但感觉它离它的初衷并不太远。到目前为止我还好吗?在

我把一些东西拼凑在一起,让它运行起来。但这样做,感觉不对,恐怕迟早会引起问题。在

我的解决方案存在以下问题:

  • 当简单地用PyCharm运行这个东西而不限制测试时,它不仅尝试运行预期的StandaloneSessionTests和{},而且还试图运行{},后者只是集合,没有会话,即执行上下文。

  • 我可以通过不从TestCase派生这个函数来使它运行GroupOfTests,但是PyCharm抱怨它不知道assert...()函数。这样做是正确的,因为GroupOfTest只有在派生类也从TestCase继承时,才能在运行时间接访问这些函数。来自C++背景,这感觉像是黑魔法,我不认为我应该这样做。

我尝试将会话创建类传递给GroupOfTests的构造函数,如下所示:__init__(self, session_class)。但是当unittest框架试图实例化测试时,这会导致问题:它不知道如何处理附加的__init__参数。在

我学习了@classmethod,这似乎是一种绕过Python“只有一个构造函数”限制的方法,但我无法找到让它运行的方法。在

我正在寻找一个解决方案,让我可以简单地陈述如下:

suite = unittest.TestSuite()
suite.addTest(GroupOfTests(UseExistingSession))
suite.addTest(GroupOfTests(CreateStandaloneSession))
...

到目前为止我得到的是:

^{pr2}$

Tags: 方法函数框架apiinitunittest解决方案条件
0条回答
网友
1楼 · 发布于 2024-10-01 04:58:06

我不确定使用^{}是否适合您,但如果是这样的话,下面是一个可以满足您需要的示例。在

import pytest


class Session:
    def __init__(self, session_id=None):
        self.id = session_id


existing_session = Session(999)
new_session = Session(111)


@pytest.fixture(params=[existing_session, new_session])
def session_fixture(request):
    return request.param


class TestGroup:
    def test_stuff(self, session_fixture):
        print('(1) Test with session: {}'.format(session_fixture.id))
        assert True

    def test_more_stuff(self, session_fixture):
        print('(2) Test with session: {}'.format(session_fixture.id))
        assert True

输出:

^{pr2}$

如果您真的要使用pytest,那么您可能希望跟随conventions for Python test discovery,而不是使用hmm.py作为文件名!在

网友
2楼 · 发布于 2024-10-01 04:58:06

通过使用raise NotImplementetError创建抽象方法,可以让pycharm忽略这些不存在的函数:

class GroupOfTests:
    session_id = None

    def test_stuff(self):
        the_thing = do_thing(self.session_id)
        self.assertGreater(the_thing, 2)

    def assertGreater(self, a, b): # Pycharm treats these like abstract methods from the ABC module
        raise NotImplementetError

这将使python相信这是一个抽象类,如果子类没有定义这些函数,则pycharm将引发错误。在

相关问题 更多 >