代码之家  ›  专栏  ›  技术社区  ›  hirolau

Pytest fixture:在每个测试之间设置、拆卸和运行代码

  •  2
  • hirolau  · 技术社区  · 6 年前

    我当前的代码如下:

    import pytest
    import leelaZeroWrapper
    
    @pytest.fixture(scope='module')
    def leela(request):
        leela = leelaZeroWrapper.LeelaWrapper()
        def quit():
            leela.quit()
        request.addfinalizer(quit)
        return leela
    
    def test_single_play(leela):
        leela.reset()
        result = leela.play('b', 'a11')
        assert result == [{'color': 'black', 'loc': 'a11'}]
    
    def test_single_play_uppercase(leela):
        leela.reset()
        result = leela.play('WHITE', 'A11')
        assert result == [{'color': 'white', 'loc': 'a11'}]
    
    def test_reset(leela):
        leela.reset()
        leela.play('b', 'a11')
        leela.play('w', 'a13')
        leela.reset()
        assert leela.current_board == []
        assert leela.current_move == 0
    

    我想要的伪代码:

    @pytest.fixture(scope='module')
    def leela(request):
        leela = leelaZeroWrapper.LeelaWrapper()
        def quit():
            leela.quit()
        def reset():
            leela.reset()
        request.addfinalizer(quit)
        request.add_between_test_resetter(reset)
        return leela
    

    如果初始设置没有那么重,我就跳过这个,让类初始化每个测试。我试图查看请求对象的文档,但找不到合适的方法。我想这一定是用别的方法解决的。知道吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   hoefling    6 年前

    只需引入另一个执行重置的设备。使其成为自动使用夹具,以便在每次测试前自动执行:

    @pytest.fixture(scope='module')
    def leela():
        leela = leelaZeroWrapper.LeelaWrapper()
        yield leela
        leela.quit()
    
    @pytest.fixture(autouse=True)
    def reset(leela):
        leela.reset()
    
    
    def test_single_play(leela):
        result = leela.play('b', 'a11')
        assert result == [{'color': 'black', 'loc': 'a11'}]
    

    默认的fixture范围是 function reset 夹具将在模块中的每次测试之前重新运行。