1. Conceito
pytest é uma estrutura de teste de unidade para Python, que é semelhante à estrutura de teste integrada UnitTest. Comparada com a estrutura UnitTest, é mais simples e mais eficiente de usar.
2. Características
- Fácil de usar, documentação rica, fácil de começar, há muitos exemplos na documentação para referência
- Suporta testes de unidade simples e testes funcionais complexos
- Parametrização de suporte
- Alguns testes podem ser ignorados durante a execução do teste ou alguns casos de falha esperados podem ser marcados como falhas
- Casos que suportam falhas de execução repetidas
- Suporta a execução de casos de teste escritos por Nose e UnitTest (o código UnitTest pode ser executado diretamente com pytest)
- Possui muitos plug-ins de terceiros e pode ser personalizado e estendido
- Fácil integração com ferramentas de integração contínua
3. Instalação
安装:pip3 install pytest
查看:pip show pytest
确认版本:pytest --version
Ou instale o pytest diretamente no pycharm
Nota: Se o comando pytest não estiver disponível, você precisa abrir o terminal como administrador para reinstalar o pytest
4. Formato do código
class Testxxx: # Test 开头的测试类
def testxxx(self): # test 开头的测试方法
pass
5. Modo de operação
(1) Modo de linha de comando
Execute pytest -s test.py (nome do arquivo) na linha de comando
(2) Modo de função principal
Adicione a função principal ao arquivo Python:
if __name__ == '__main__'
pytest.main(['-s',"文件名"])
-s indica suporte para impressão de console, se nenhuma impressão for adicionada, nada aparecerá
6. Método especial (mesmo efeito do acessório na estrutura UnitTest)
(1) Nível do método
# 初始化(前置处理)
def setup(self): --> 首先自动执行
# 销毁(后置处理)
def teardown(self): --> 最后自动执行
# 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown
(2) Nível de classe
# 初始化(前置处理)
def setup_class(self): --> 首先自动执行
# 销毁(后置处理):
def teardown_class(self): --> 最后自动执行
# 运行于测试类的始末,即:每个测试类只会运行一次setup_class和teardown_class
7. Arquivo de configuração
Cenário de aplicação: Depois de usar o arquivo de configuração, você pode usar rapidamente os itens configurados para selecionar quais módulos de teste executar
Como usar: Crie um arquivo pytest.ini no diretório raiz (arquivos tox.ini ou setup.cfg também estão disponíveis)
conteúdo do documento:
[pytest]
testpaths = ./study/pytest # 文件搜索路径,即文件所在位置
addopts = -s # 添加命令行参数
python_files = test*.py # 指定文件名称
python_classes = Test* # 指定类名称
python_functions = test* # 指定方法名称
Observação:
1. No sistema Windows, no arquivo de configuração pytest, não é permitido escrever informações de comentários
2. Um projeto precisa apenas de um arquivo de configuração pytest e o nome do arquivo precisa estar correto
3. Em geral, você só precisa colocar o arquivo de configuração pytest no diretório raiz do projeto
4. Para um projeto configurado com um arquivo de configuração pytest, você só precisa abrir a linha de comando e digitar o comando pytest para executar o teste
8. Plugins comuns para pytest
(1) Gerar plug-in de relatório de teste pytest-html
Instalação: Instale via pip3 install pytest-html ou instale o plugin pytes-html via pycharm
Uso: Adicione --html=report path/report.html ao parâmetro de linha de comando addopts no arquivo de configuração
Se você deseja mesclar arquivos css, adicione --self-contained-html após
(2) Plug-ins que controlam a ordem de execução das funções pytest
Instalação: Instale via pip3 install pytest-ordering ou instale o plugin pytest-ordering via pycharm
Use: mark e função testada, @pytest.mark.run(order=x)
ordem Se todos positivos ou todos negativos, quanto menor o valor, maior a prioridade; quando existem números positivos e negativos ao mesmo tempo, o número positivo tem maior prioridade
(3) plug-in de nova tentativa de falha do pytest
Instalação: instale via pip3 instale pytest-rerunfailures ou instale o plugin pytest-rerunfailures via pycharm
Uso: Adicione --reruns -n ao parâmetro de linha de comando addopts no arquivo de configuração (n determina o número de novas tentativas, não mais que 3)
9. Pular operação
# 跳过测试函数
# 参数:
# condition:跳过的条件,必传参数
# reason:标注原因,必传参数
@pytest.mark.skipif(condition , reason=None)
Uso: Adicione o decorador @pytest.mark.skipif(condition,reason="xxx") ao script de teste que precisa ser ignorado
10. Parametrização
# 数据参数化
# 参数:
# argnames:参数名
# argvalues:参数对应值,类型必须为可迭代类型,一般用list
@pytest.mark.parametrize(argnames,argvalues,indirect=False,ids=None,scope=None)
Uso: adicione o decorador @pytest.mark.parametrize(argnames,argvalues) no topo da função de teste que precisa ser parametrizada
Exemplo de um único parâmetro:
import pytest
class Test1:
@pytest.mark.parametrize("name",["小明","小李","小张"])
def test_method(self,name):
print(name)
Exemplo com vários parâmetros:
import pytest
class TestLogin:
# 拓展:另一种写法
# @pytest.mark.parametrize(("admin","passwd"),[("admin",123456),("test",456789)])
@pytest.mark.parametrize("admin,passwd",[("admin",123456),("test",456789),("xxx","yyy")])
def test_method(self,admin,passwd):
print(admin)
print(passwd)
11, Afirmação
Método: assert xxx que vem com o sistema (o método assertion que vem com o framework UnitTest)
Exemplo:
assert 1==2 # 判断是否相等
assert "name" in "my name is student" # 判断是否包含
assert 2 > 1 # 判断大小