Como suprimir avisos de suspensão de uso internos de py.test

94

Existe uma maneira de suprimir os avisos de depreciação internos do pytest?

Contexto: Estou procurando avaliar a dificuldade de portar um conjunto de testes de nosepara pytest. O conjunto é bastante grande e usa geradores de teste baseados no noseestilo de uso intenso yield.

Gostaria de primeiro ter certeza de que os testes existentes passam com o pytest e, em seguida, talvez alterar os geradores de teste para parameterized.

Apenas rodar $ pytest path-to-test-foldercom o pytest 3.0.4 é completamente dominado por páginas e páginas de

WC1 ~repos/numpy/numpy/lib/tests/test_twodim_base.py yield tests are deprecated, and scheduled to be removed in pytest 4.0

Existe uma maneira de desligar esses avisos?

ev-br
fonte

Respostas:

85

De pytest --help:

--disable-pytest-warnings
                      disable warnings summary, overrides -r w flag
O compilador
fonte
4
Como diz o texto de ajuda, isso apenas omitirá o resumo textual. O resultado ainda ficará amarelo e mostrará que há avisos.
David Pärsson
Melhor colocar o arquivo pytest.ini, conforme mostrado abaixo.
vy32
93

pytest -p no:warningsou adicione o seguinte ao seu pytest.ini ou tox.ini:

[pytest]
addopts = -p no:warnings

O resultado será verde sem qualquer indicação de avisos. Consulte a documentação em https://docs.pytest.org/en/latest/warnings.html#disabling-warnings-summary .

Este pode ser um caso de uso válido para um conjunto de testes em que você deseja uma saída limpa.

Esteja ciente de que sempre ocultar todos os avisos pode fazer com que você perca avisos importantes. Se você quiser ocultar apenas avisos específicos, veja a resposta de Cloc .

Blaise
fonte
2
addopts = -p no:warningsé uma ideia MUITO RUIM e a solução CloC é muito mais sã, mas tive que usar a sua quando ignore::InsecureRequestWarningnão foi reconhecida, então você também ganha +1
Peter M. - representa Monica
Desativar todos os avisos persistentemente (ou seja, usando pytest.ini) quase nunca é uma boa ideia. Desativar apenas o aviso de suspensão de uso (e por módulo), conforme descrito pelo CloC, é a maneira correta de fazer isso.
Neowizard
71

Acho que você não quer esconder todos os avisos, mas apenas aqueles que não são relevantes. E, neste caso, avisos de depreciação de módulos Python importados.

Ler a documentação do pytest sobre Captura de avisos :

A opção de linha de comando -W e a opção filterwarnings ini são baseadas na opção -W do próprio Python e warnings.simplefilter , portanto, consulte essas seções na documentação do Python para outros exemplos e uso avançado.

Assim, você pode filtrar avisos com a -Wopção do python !

Parece que pytestremove completamente os filtros, porque mostra todos eles DeprecationWarningdurante a execução, e a documentação do Python sobre Filtros de Aviso Padrão diz claramente:

Em versões regulares, o filtro de aviso padrão tem as seguintes entradas (em ordem de precedência):

default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning

Portanto, no seu caso, se você quiser filtrar os tipos de aviso que deseja ignorar, como esses DeprecationWarning, basta executar o comando pytest com a -Wopção:

$ pytest path-to-test-folder -W ignore::DeprecationWarning

EDITAR : A partir do comentário do colini , é possível filtrar por módulo. Exemplo para ignorar avisos de suspensão de uso de todos os sqlalchemy:

ignore::DeprecationWarning:sqlalchemy.*:

Você pode então listar seus módulos instalados que criam muito ruído na saída de pytest

Use com arquivo em vez de linha de comando:

Você pode preferir listar esses filtros no arquivo pytest.ini:

[pytest]
filterwarnings =
    ignore::DeprecationWarning
CloC
fonte
9
Para filtrar no módulo, você usa um regex. Exemplo para ignorar avisos de depreciação de todos os módulos sqlalchemy:ignore::DeprecationWarning:sqlalchemy.*:
colini
@colini que falhou para mim como um argumento para o sinalizador -W, mas funcionou para mim no meu arquivo pytest.ini.
WhiteHotLoveTiger de
6

No arquivo pytest.ini, você pode adicionar:

[pytest]
addopts = -p no:warnings

OU passando abaixo da linha na linha de comando. Isso pode ser útil se seus suítes de teste tratam de avisos usando um sistema externo.

-p não: avisos

OU se você deseja apenas ocultar algum aviso específico obsoleto, adicione a instrução abaixo em seu arquivo pytest.ini

[pytest]
filterwarnings =
    ignore:.*U.*mode is deprecated:DeprecationWarning

Isso irá ignorar todos os avisos do tipo DeprecationWarning, em que o início da mensagem corresponde à expressão regular ". * U. * mode is deprecated".

OU Embora não seja recomendado, você pode usar o

--disable-warnings

opção de linha de comando para suprimir totalmente o resumo do aviso da saída da execução do teste.

pk786
fonte
5

Eu não quero esconder todos os avisos, então coloquei isso pytest.ini

[pytest]
filterwarnings =
    ignore::DeprecationWarning
Polv
fonte