Como desativo um teste usando o pytest?

86

Digamos que eu tenha um monte de testes:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Existe um decorador ou algo semelhante que eu possa adicionar às funções para evitar a pytestexecução apenas desse teste? O resultado pode ser parecido com ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...
Ericmjl
fonte

Respostas:

133

Pytest tem os decoradores skip e skipif, semelhantes ao módulo Python unittest (que usa skipe skipIf), que pode ser encontrado na documentação aqui .

Exemplos do link podem ser encontrados aqui:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

O primeiro exemplo sempre ignora o teste, o segundo exemplo permite que você ignore condicionalmente os testes (ótimo quando os testes dependem da plataforma, versão executável ou bibliotecas opcionais.

Por exemplo, se eu quiser verificar se alguém tem a biblioteca pandas instalada para um teste.

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...
Alexander Huszagh
fonte
Existe algo semelhante ao elegante .skipque o Mocha (Node.js) tem? it('tests something'...)-> it.skip('tests something'...)que desabilitaria aquele teste específico. Ele também tem o oposto útil: o .onlyque executará apenas aquele teste e nada mais.
Juha Untinen
Quero dizer, da onlyparte, você pode fazer isso por meio da linha de comando ou o que quer que você use para inicializar o executor de teste: stackoverflow.com/a/36539692/4131059 Quanto ao ite it.skip, acredito que a funcionalidade aqui cobre isso totalmente.
Alexander Huszagh
21

O skipdecorador faria o trabalho:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

(o reasonargumento é opcional, mas é sempre uma boa ideia especificar por que um teste é ignorado).

Existe também skipif()que permite desabilitar um teste se alguma condição específica for atendida.


Esses decoradores podem ser aplicados a métodos, funções ou classes.

Para pular todos os testes em um módulo , defina uma pytestmarkvariável global :

# test_module.py
pytestmark = pytest.mark.skipif(...)
Alecxe
fonte
10

Não tenho certeza se ele está obsoleto, mas você também pode usar a pytest.skipfunção dentro de um teste:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
Wayne Werner
fonte
2
veio para o auxílio pytest, ficou para a referência
Uzebeckatrente
o que isso faz referência. Eu tenho que saber
XChikuX
@XChikuX youtube.com/watch?v=xOrgLj9lOwk
Wayne Werner
Receio que isso foi muito antes do meu tempo. Mas estou feliz por saber disso agora.
XChikuX
6

Você também pode executar o teste, mesmo se suspeitar que ele falhará. Para tal cenário, https://docs.pytest.org/en/latest/skipping.html sugere o uso do decorador @ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

Nesse caso, o Pytest ainda executará o teste e informará se ele foi aprovado ou não, mas não reclamará e quebrará a compilação.

Ruben Gasparian
fonte
2

Se você deseja pular o teste, mas não codificar um marcador, é melhor usar a expressão de palavra-chave para escapá-lo.

pytest test/test_script.py -k 'not test_func_one'
Arindam Roychowdhury
fonte
1

Você pode marcar um teste com os decoradores skipe skipifquando quiser pular um teste no pytest.

Pulando um teste

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

A maneira mais simples de pular um teste é marcá-lo com o skipdecorador que pode ser aprovado em um opcional reason.

Também é possível pular imperativamente durante a execução ou configuração do teste chamando a pytest.skip(reason)função. Isso é útil quando não é possível avaliar a condição de ignorar durante o tempo de importação.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Pular um teste com base em uma condição

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Se você quiser pular com base em uma condição, poderá usar skipif. No exemplo anterior, a função de teste é ignorada quando executada em um interpretador anterior ao Python3.6.

Por fim, se quiser pular um teste porque tem certeza de que ele está falhando, você também pode usar o xfailmarcador para indicar que espera que um teste falhe.

lmiguelvargasf
fonte