Existe uma maneira de selecionar pytest
testes para executar a partir de um arquivo? Por exemplo, um arquivo foo.txt
contendo 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.mark
contra 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?
py.test path/to/test/file.py -k function_name_test
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_something
mas nãoTestMyClass.test_method_simple
.Execute testes por IDs de nós
A cada teste coletado é atribuído um único
nodeid
que 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
fonte
Se você tem o mesmo nome de método em duas classes diferentes e deseja apenas executar uma delas, isso funciona:
fonte
Método 1 : testes selecionados aleatoriamente. Longo e feio.
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'.
Digamos que os dois acima estejam realmente corretos, dois testes serão executados.
Caso 2: Agora, um nome incorreto e outro nome correto.
Apenas um é encontrado e executado.
Caso 3 : se você deseja que todos os testes sejam executados ou ninguém, use AND
Ambos serão executados se estiverem corretos ou nenhum.
Caso 4: execute o teste apenas em uma pasta:
Caso 5: execute o teste a partir de apenas um arquivo.
Caso 6: execute todos os testes, exceto a partida.
fonte
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
é o mesmo com o comando abaixo (com o conteúdo do arquivo na pergunta)
fonte
Minha resposta fornece maneiras de executar um subconjunto de teste em diferentes cenários.
Executar todos os testes em um projeto
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
: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
:Executar uma única função de teste
Para executar uma única função de teste, adicione
::
e o nome da função de teste:-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: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:Execute um conjunto de testes com base no nome do teste
A
-k
opçã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:
fonte
Talvez usando
pytest_collect_file()
hook, você possa analisar o conteúdo de um arquivo.txt
o.yaml
onde 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.
fonte
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
unittest
scripts, portanto, não garantindo que funcione com o pytest nativo.Aqui vai:
subset_tests_directory
.ln -s tests_directory/foo.py
ln -s tests_directory/bar.py
tenha cuidado com as importações que implicitamente assumem que os arquivos estão
test_directory
. Eu tive que corrigir várias delas executandopython foo.py
, de dentrosubset_tests_directory
e corrigindo conforme necessário.Uma vez que os scripts de teste sejam executados corretamente, apenas
cd subset_tests_directory
epytest
ali. 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.py
entãopytest 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.fonte