Prova caso di ordine di esecuzione in pytest

Sto usando pytest. Ho due file in una directory. In uno dei file c’è una lunga esecuzione di test case che genera qualche uscita. In un altro file c’è un caso di test che legge che in uscita. Come posso garantire la corretta esecuzione dell’ordine di due casi di test? Non c’è alcuna alternativa diversa, una volta inserito i casi di test nello stesso file nell’ordine corretto?

  • in generale non è una grande idea di avere casi di test dipendenti l’uno dall’altro. Se è necessario utilizzare gli stessi dati in 2 casi di test perché non aggiungere alla setup sezione?
  • So. Non mi piace ma in questo momento ne ho bisogno.
  • Non voglio aggiungere alla sezione installazione, perché ci vogliono circa 15-20 minuti.
  • hmm, un modo per deridere fuori? Se poi non si può avere bisogno per caso di collegamento di due prove (o li fanno una grande prova)
  • Condivisa o ambientale codice di installazione va in setUpClass metodo, verrà eseguito una sola volta, e prima di ogni test. In alternativa si potrebbe scrivere pigro-inizializzazione schema di codice nel metodo di installazione. o anche scrivere – initialized=False def test_mytest1: if initialized: somelongfunction() initialized=True Piuttosto utilizzare il framework. Considerare la possibilità, che se hai bisogno di ordinare i test, non sono più test di unità, ed è necessario pensare a un nuovo livello di ponteggi per semplificare questo.
InformationsquelleAutor Kocka | 2013-07-10



7 Replies
  1. 24

    In generale, è possibile configurare il comportamento di praticamente qualsiasi parte del pytest utilizzando il suo ben specificato ganci.

    Nel tuo caso, si desidera che il “pytest_collection_modifyitems” gancio, che consente di ri-ordine raccolte prove a posto.

    Che ha detto, sembra come ordinare il test dovrebbe essere più semplice-si tratta di Python, dopo tutto! Così ho scritto un plugin per ordinare il test: “pytest-ordinazione”. Controllare il docs o installarlo da pypi. Ora mi consiglia di utilizzare @pytest.mark.prima e @pytest.mark.secondo, o uno dei @pytest.mark.ordine# marcatori, ma ho alcune idee su più utile Api. Suggerimenti sono i benvenuti 🙂

    • Hey. Grazie per la creazione di questo plugin. È possibile modificare tale che appena estratti cifre finali dell’ordine. E. g Se dico @pytest.mark.1 , quindi 1 deve essere l’ordine. Questo sarebbe di grande aiuto!
    • Posso provare. Penso v0.2 ha questo comportamento con un “ordine” marcatore, invece di marcatori arbitrari. Puoi scrivere questo come una richiesta di funzionalità su pytest-ordine della pagina di github? github.com/ftobia/pytest-ordering
    • I ganci di collegamento dovrebbe andare a: pytest.org/latest/writing_plugins.html#well-specified-hooks
    • Ho notato in pytest v3.0.3 che l’ordine di prove di items elenco pytest_collection_modifyitems() non corrisponde all’ordine in cui i test sono effettivamente eseguito, e non so perché.
    • hai dedotto perché l’ordine cambia?
    • Non ho, purtroppo. Ho finito per fare in modo che il mio test possono essere eseguiti in qualsiasi ordine (probabilmente una cosa sensata, comunque) e che ha lavorato tutto il problema.

  2. 6

    C’è anche un plugin pytest-ordinazione che sembra soddisfare le vostre esigenze.

    • Frank T. la risposta già accenna a questo plugin è stato postato 3 anni prima di questa risposta.
    • uh, ma non ha detto il nome. ecco perché io probabilmente completamente mancato il punto.
    • Il nome è citato così 🙂
  3. 5

    Forse si può considerare l’utilizzo di dipendenza pytest plugin, dove è possibile impostare la prova dipendenze facilmente:

    @pytest.mark.dependency()
    def test_long():
        pass
    
    @pytest.mark.dependency(depends=['test_long'])
    def test_short():
        pass

    Questo modo test_short eseguirà solo se test_long è successo e forza la sequenza di esecuzione così.

    • Sopra non funziona per me, per ordine di sequenza. Per esempio: se si ribalta l’ordine. Cioè Hanno a lungo dipendono breve. In questo caso, è lungo ignorati.
    • Questa risposta utilizza il pytest plugin pytest-dipendenza
    • Il test di sedersi in due diversi moduli e come sottolineato nel github.com/RKrahl/pytest-dependency/issues/3 ancora non è possibile avere un test dipende per un altro test in un altro modulo
  4. 1

    Provare questo:

    @pytest.fixture(xxx)
    def test_A():
        pass
        yield
        pass
    
    @pytest.mark.usefixtures('test_A')
    def test_B():
        pass
    • Mentre questo codice può rispondere alla domanda, è meglio spiegare come risolvere il problema e fornire il codice di esempio o di riferimento. Codice-solo le risposte possono essere fonte di confusione e mancanza di contesto.
    • Questo trasforma sostanzialmente un test in un apparecchio giusto?
  5. 1

    main.py:

    import functools
    import pytest
    from demo import test_foo,test_hi
    
    def check_depends(depends):
        try:
            for dep in depends:
                dep()
        except Exception as e:
            return dep
        else:
            return True
    
    def pytest_depend(depends):
        def pytest_depend_decorator(func):
            stat = check_depends(depends)
            if stat is True:
                return func
            else:
                return pytest.mark.skip(True, reason="%s[skip] --> %s[Failed]" % (func.__name__, stat.__name__))(func)
        return pytest_depend_decorator
    
    
    @pytest_depend([test_foo,test_hi])
    def test_bar():
        pass
    
    @pytest_depend([test_foo,test_hi])
    def test_bar2():
        pass

    demo.py:

    def test_hi():
        pass
    def test_foo():
        assert False

    piattaforma linux — Python 3.5.2, pytest-3.8.2, py-1.6.0, pluggy-0.7.1 — /usr/bin/python3

    pytest -vrsx ./plugin.py

  6. 0

    Assicurarsi di aver installato pytest-ordinare il pacchetto.
    Per confermare vai a Pycharm impostazioni>>Progetto di Interprete >> e cercare pytest-ordinazione :
    Se non è disponibile l’installazione.
    Pycharm impostazioni>>Progetto di Interprete >> fare Clic sul pulsante + e ricerca pytest-richiesta di installazione.
    Voila!!!! Funzionerà sicuramente.

  7. 0

    Utilizzare il ‘–casualmente-non-riorganizzare’ opzione o ‘-p no:casualmente’ disponibile in pytest-casualmente plugin, questo sarà solo eseguire il test nello stesso ordine, come ha detto nel suo modulo.

    Modulo:

    import pytest
    
    def test_three():
        assert True
    
    def test_four():
        assert True
    
    def test_two():
        assert True
    
    def test_one():
        assert True

    Di esecuzione:

    (tmp.w95BqE188N) [email protected]-rkalaiselvan:~/$ py.test --randomly-dont-reorganize test_dumm.py
    ======================================================================== test session starts ========================================================================
    platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
    cachedir: .pytest_cache
    Using --randomly-seed=1566829391
    rootdir: /home/rkalaiselvan, inifile: pytest.ini
    plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
    collected 4 items
    
    test_dumm.py::test_three PASSED
    test_dumm.py::test_four PASSED
    test_dumm.py::test_two PASSED
    test_dumm.py::test_one PASSED
    
    (tmp.w95BqE188N) [email protected]-rkalaiselvan:~/$ py.test -p no:randomly test_dumm.py
    ======================================================================== test session starts ========================================================================
    platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
    cachedir: .pytest_cache
    Using --randomly-seed=1566829391
    rootdir: /home/rkalaiselvan, inifile: pytest.ini
    plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
    collected 4 items
    
    test_dumm.py::test_three PASSED
    test_dumm.py::test_four PASSED
    test_dumm.py::test_two PASSED
    test_dumm.py::test_one PASSED

Lascia un commento