Existe uma maneira de especificar quais testes pytest devem ser executados a partir de um arquivo?


190

Existe uma maneira de selecionar pytesttestes para executar a partir de um arquivo? Por exemplo, um arquivo foo.txtcontendo uma lista de testes a serem executados:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

Ou existe uma maneira de selecionar vários testes, sem padrão comum no nome do teste, de diferentes diretórios com pytest?

pytest -k <pattern> permite um único padrão.

Uma opção é ter um pytest.markcontra cada teste, mas meu requisito é executar uma combinação diferente de testes a partir de arquivos diferentes.

Existe uma maneira de especificar vários padrões e um nome de arquivo de teste para cada padrão?

Ou

Existe uma maneira de especificar os caminhos de teste exatos em um arquivo e alimentá-lo como entrada pytest?

Ou

Existe uma função de gancho que pode ser utilizada para esse fim?

Respostas:


231

Você pode usar a -kopção para executar casos de teste com diferentes padrões:

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

Isso executará casos de teste com o nome test_001 e test_some_other_test desmarcando o restante dos casos de teste.

Nota: Isso selecionará qualquer caso de teste que comece com test_001 ou test_some_other_test . Por exemplo, se você tiver o caso de teste test_0012, ele também será selecionado.


1
Obrigado. Mas se houver um teste com o mesmo nome em foo.py e bar.py (digamos test_001), ele terminará sendo executado pelos dois.
Sharad

2
sim vai, qualquer coisa que corresponda ao padrão será executado como já referi na nota
supamaze

Mas isso é um problema para mim. Eu gostaria de escolher quais testes executar a partir de qual arquivo.
Sharad

@NamGVU `-k <nome do método de teste>`
supamaze

4
Deveria serpy.test path/to/test/file.py -k function_name_test
LittleZero

91

Especificando testes / selecionando testes

O Pytest suporta várias maneiras de executar e selecionar testes na linha de comando.

Executar testes em um módulo

pytest test_mod.py

Executar testes em um diretório

pytest testing/

Executar testes por expressões de palavra-chave

pytest -k "MyClass and not method"

Isso executará testes que contêm nomes que correspondem à expressão de string especificada, que podem incluir operadores Python que usam nomes de arquivos, nomes de classes e nomes de funções como variáveis. O exemplo acima será executado, TestMyClass.test_somethingmas não TestMyClass.test_method_simple.

Execute testes por IDs de nós

A cada teste coletado é atribuído um único nodeidque consiste no nome do arquivo do módulo seguido por especificadores como nomes de classes, nomes de funções e parâmetros da parametrização, separados por:: caracteres.

Para executar um teste específico dentro de um módulo:

pytest test_mod.py::test_func

Outro exemplo especificando um método de teste na linha de comando:

pytest test_mod.py::TestClass::test_method

Executar testes por expressões de marcador

pytest -m slow

Realizará todos os testes decorados com o @pytest.mark.slow decorador.

Para mais informações, consulte marcas .

Execute testes a partir de pacotes

pytest --pyargs pkg.testing

Isso importará pkg.testing e usará a localização do sistema de arquivos para encontrar e executar testes.

Fonte: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests


o test_mod.py::TestClass::test_method funcionou melhor para mim
StephenGodderidge

1
deve marcar isso como anser aceito
Adam Hughes

13

Se você tem o mesmo nome de método em duas classes diferentes e deseja apenas executar uma delas, isso funciona:

pytest tests.py -k 'TestClassName and test_method_name'

6

Método 1 : testes selecionados aleatoriamente. Longo e feio.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

Método 2: use expressões de palavras-chave.

Nota: Estou pesquisando pelos nomes dos casos de teste. O mesmo se aplica aos nomes TestClass.

Caso 1: O abaixo será executado o que for encontrado. Desde que usamos 'OR'.

python -m pytest -k 'test_password_valid or test_no_configuration'

Digamos que os dois acima estejam realmente corretos, dois testes serão executados.

Caso 2: Agora, um nome incorreto e outro nome correto.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Apenas um é encontrado e executado.

Caso 3 : se você deseja que todos os testes sejam executados ou ninguém, use AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Ambos serão executados se estiverem corretos ou nenhum.

Caso 4: execute o teste apenas em uma pasta:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

Caso 5: execute o teste a partir de apenas um arquivo.

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

Caso 6: execute todos os testes, exceto a partida.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'

1

De acordo com o documento sobre Executar testes por IDs de nós

desde que você tenha todos os IDs de nó em foo.txt, execute

pytest `cat foo.txt | tr '\n' ' '`

é o mesmo com o comando abaixo (com o conteúdo do arquivo na pergunta)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test

1

Minha resposta fornece maneiras de executar um subconjunto de teste em diferentes cenários.

Executar todos os testes em um projeto

pytest

Executar testes em um único diretório

Para executar todos os testes em um diretório, use o diretório como um parâmetro para pytest:

pytest tests/my-directory

Executar testes em um único arquivo / módulo de teste

Para executar um arquivo cheio de testes, liste o arquivo com o caminho relativo como parâmetro para pytest:

pytest tests/my-directory/test_demo.py

Executar uma única função de teste

Para executar uma única função de teste, adicione ::e o nome da função de teste:

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v é usado para que você possa ver qual função foi executada.

Executar uma única classe de teste

Para executar apenas uma classe, faça como fizemos com as funções e adicione ::, em seguida, o nome da classe no parâmetro file:

pytest -v tests/my-directory/test_demo.py::TestClassName

Executar um único método de teste de uma classe de teste

Se você não deseja executar toda uma classe de teste, apenas um método, basta adicionar outro ::e o nome do método:

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

Execute um conjunto de testes com base no nome do teste

A -kopção permite transmitir uma expressão para executar testes que possuem determinados nomes especificados pela expressão como uma subcadeia do nome do teste. É possível usar e , ou , e não criar expressões complexas.

Por exemplo, para executar todas as funções que possuem _raises em seus nomes:

pytest -v -k _raises

0

Talvez usando pytest_collect_file()hook, você possa analisar o conteúdo de um arquivo .txto .yamlonde os testes são especificados conforme desejado e retorná-los ao núcleo do pytest.

Um bom exemplo é mostrado na documentação do pytest . Eu acho que você está procurando.


0

Aqui está uma resposta parcial possível, porque ela permite apenas selecionar os scripts de teste, não testes individuais dentro desses scripts.

E isso também é limitado pelo uso do modo de compatibilidade herdado x unittestscripts, portanto, não garantindo que funcione com o pytest nativo.

Aqui vai:

  1. crie um novo ditado, digamos subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. tenha cuidado com as importações que implicitamente assumem que os arquivos estão test_directory. Eu tive que corrigir várias delas executando python foo.py, de dentro subset_tests_directorye corrigindo conforme necessário.

  5. Uma vez que os scripts de teste sejam executados corretamente, apenas cd subset_tests_directorye pytestali. O Pytest só pega os scripts que vê.

Outra possibilidade é a ligação simbólica no diretório de teste atual, digamos como ln -s foo.py subset_foo.pyentão pytest subset*.py. Isso evitaria a necessidade de ajustar suas importações, mas atrapalharia as coisas até você remover os links simbólicos. Trabalhou para mim também.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.