Chaining tests and passing an object from one test to another

后端 未结 2 940
南笙
南笙 2021-02-02 00:34

I\'m trying to pass the result of one test to another in pytest - or more specifically, reuse an object created by the first test in the second test. This is how I currently do

相关标签:
2条回答
  • 2021-02-02 00:40

    For sharing data between tests, you could use the pytest namespace or cache.

    Namespace

    Example with sharing data via namespace. Declare the shared variable via hook in conftest.py:

    # conftest.py
    
    import pytest
    
    
    def pytest_namespace():
        return {'shared': None}
    

    Now access and redefine it in tests:

    import pytest
    
    
    def test_creation():
        pytest.shared = 'spam'
        assert True
    
    
    def test_deletion():
        assert pytest.shared == 'spam'
    

    Cache

    The cache is a neat feature because it is persisted on disk between test runs, so usually it comes handy when reusing results of some long-running tasks to save time on repeated test runs, but you can also use it for sharing data between tests. The cache object is available via config. You can access it i.e. via request fixture:

    def test_creation(request):
        request.config.cache.set('shared', 'spam')
        assert True
    
    
    def test_deletion(request):
        assert request.config.cache.get('shared', None) == 'spam'
    

    ideally this test should only run if the previous test was successful

    There is a plugin for that: pytest-dependency. Example:

    import pytest
    
    
    @pytest.mark.dependency()
    def test_creation():
        assert False
    
    
    @pytest.mark.dependency(depends=['test_creation'])
    def test_deletion():
        assert True
    

    will yield:

    $ pytest -v
    ============================= test session starts =============================
    ...
    collected 2 items
    
    test_spam.py::test_creation FAILED                                      [ 50%]
    test_spam.py::test_deletion SKIPPED                                     [100%]
    
    ================================== FAILURES ===================================
    ________________________________ test_creation ________________________________
    
        def test_creation():
    >       assert False
    E       assert False
    
    test_spam.py:5: AssertionError
    ===================== 1 failed, 1 skipped in 0.09 seconds =====================
    
    0 讨论(0)
  • 2021-02-02 00:53
    #Use return and then call it later so it'll look like: 
    
    def test_creation():
        object = create_object()
        assert object.status == 'created'
        return(object.id) #this doesn't show on stdout but it will hand it to what's calling it
    
    
    def test_update(id):
        object = test_creation
        object.id = id
        object.update()
        assert object.status == 'updated' # some more tests
    
    #If this is what youre thinking of there ya go
    
    0 讨论(0)
提交回复
热议问题