Teste automatizado Python - estrutura e ferramentas de automação

1. Visão Geral

A metodologia de teste do procedimento é baseada nos pontos mencionados no artigo anterior:

  • O teste funcional não é recomendado para automação
  • O teste de interface é o mais econômico
  • O teste de interface pode ser automatizado

A automação de teste mencionada posteriormente  também  será introduzida  em torno  da automação da interface .

Se você quiser aprender testes automatizados, aqui eu recomendo um conjunto de vídeos para você. Este vídeo pode ser considerado o tutorial de teste automatizado número um em toda a rede na estação B. Ao mesmo tempo, o número de pessoas online aumentou atingiu 1.000, e há notas para coletar e compartilhar com você. Dashen Technical Exchange: 798478386  

A coleção mais detalhada de tutoriais práticos para testes automatizados de interfaces Python (a versão mais recente em combate real) ensinada pela estação B https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

A linguagem de teste escolhida para esta série é  a linguagem de script python  . Como seu documento oficial tem uma explicação relativamente clara do princípio, este artigo não fará nenhum trabalho de tradução redundante. Ele é direcionado para a parte de combate real e, para ser direcionado para o combate real, também será   explicado em combinação com ferramentas IDE e organização do projeto.

As razões são as seguintes:

  1. Linguagem de script, extremamente eficiente no desenvolvimento e iteração
  2. Existem muitas bibliotecas de extensão de terceiros e muitas ferramentas prontas que posso usar

Antes de entrar oficialmente  no campo dos testes automatizados  , devemos primeiro estabelecer tais valores. Em uma publicação sobre teste de software pelos engenheiros internos do Google, é mencionado:

"O teste automatizado de software é caro e o custo não é baixo. É basicamente equivalente a   estabelecer um  projeto de desenvolvimento de teste paralelo com base no projeto de desenvolvimento de função original  ."

Em outras palavras, se você tem expectativas para testes automatizados, deve pagar o preço e a energia correspondentes. Coisas boas também exigem que pessoas excelentes gastem muito tempo para serem concluídas.

2 estrutura de teste PyUnit

Usando  python  como uma linguagem de programação automatizada, é natural usar  o pyunit  como uma estrutura de teste automatizada.

O conteúdo da parte seguinte é principalmente da documentação oficial do pyunit. Este artigo apenas faz algumas traduções e ajustes estruturais simples. Esta parte pertence aos princípios e conceitos básicos da estrutura de teste e é necessário entendê-la antes de escrever o código.

A estrutura de teste de unidade do Python,  PyUnit, pode ser considerada como a   versão de implementação da linguagem Python da  estrutura de teste de unidade JUnit sob a linguagem Java, e até mesmo um de seus autores, Kent Beck  , é o autor de JUnit.

unittest deve atingir os seguintes objetivos:

  • Suporte a testes automatizados
  • Permitir que todos os scripts de teste compartilhem  o  código de configuração  e  desligamento
  • Os scripts de casos de teste podem ser organizados em coleções
  • Separe todos os scripts de teste da estrutura de relatórios de teste

Para atingir os objetivos acima, unittest suporta os seguintes conceitos importantes:

  • acessório de teste

    Faça algum trabalho de preparação para um ou mais casos de teste, por exemplo: conecte-se a um banco de dados, crie um diretório ou inicie um processo

  • caso de teste

    Um caso de teste é a menor unidade de comportamento de teste e a verificação do teste é realizada comparando alguns valores de entrada e saída

  • suíte de teste

    Uma coleção que agrega   e organiza casos de teste  ou  coleções de casos de teste . Todos os casos de teste em um conjunto de testes podem ser executados em lotes

  • corredor de teste

    O componente que organiza a execução dos scripts de teste. O executor de teste exibe os resultados do script de teste por meio de algumas interfaces gráficas, interfaces de texto ou retornando alguns valores especiais. Usado principalmente para gerar relatórios de teste

3 Exemplo básico

O exemplo a seguir também é do documento oficial  basic_demo.py :

# coding:utf-8
"""
基本的自动化测试脚本 basic_demo.py
"""
__author__ = 'zheng'
 
import unittest
 
 
class TestStringMethods(unittest.TestCase):
 
    def setUp(self):
        print 'init by setUp...'
 
    def tearDown(self):
        print 'end by tearDown...'
 
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
 
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
        self.assertTrue('Foo'.isupper())
 
    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)
 
 
if __name__ == '__main__':
    unittest.main()

Embora a documentação oficial descreva várias maneiras de organizar scripts de casos de teste:

  1. função de teste independente
  2. Classe de teste de caso de uso único
  3. Classe de teste de caso de uso múltiplo

Diferentes formas de redação terão diferentes métodos de organização. Para detalhes, consulte os documentos oficiais. Depois de estudar os documentos oficiais, o autor deste artigo gosta do terceiro método da  classe de teste de caso multiuso , que é o método do exemplo básico acima. Esse método possui as seguintes características:

  • A classe de teste  herda de  unittest.TestCase
  • Uma classe de teste pode gerenciar várias  funções de script de teste
  • Os nomes das funções do script de teste precisam   começar com test_
  • Todas as funções de teste em uma classe de teste compartilham as funções setUp e tearDown

Execute este programa no console:

➜  src git:(master) ✗ python basic_demo.py
init by setUp...
Fend by tearDown...
init by setUp...
end by tearDown...
.init by setUp...
end by tearDown...
.
======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "basic_demo.py", line 24, in test_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (failures=1)
➜  src git:(master) ✗

A função principal do exemplo básico anterior   adota a maneira mais simples de executar diretamente todos os casos de teste e gerar um relatório de texto padrão. Na verdade, basta fazer algumas modificações simples na função de chamada, para que esses casos de teste possam ser organizados razoavelmente, e informações de dados úteis possam ser obtidas, de modo a integrar com o sistema de informações e formar uma extensão melhor.

if __name__ == '__main__':
    # unittest.main()
    # 装载测试用例
    test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
    # 使用测试套件并打包测试用例
    test_suit = unittest.TestSuite()
    test_suit.addTests(test_cases)
    # 运行测试套件,并返回测试结果
    test_result = unittest.TextTestRunner(verbosity=2).run(test_suit)
    #生成测试报告
    print("testsRun:%s" % test_result.testsRun)
    print("failures:%s" % len(test_result.failures))
    print("errors:%s" % len(test_result.errors))
    print("skipped:%s" % len(test_result.skipped))

A saída gerada após a execução é:

➜  src git:(master) ✗ python basic_demo.py
test_isupper (__main__.TestStringMethods) ... init by setUp...
FAIL
end by tearDown...
test_split (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok
test_upper (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok
 
======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "basic_demo.py", line 23, in test_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (failures=1)
testsRun:3
failures:1
errors:0
skipped:0

Obviamente, os resultados de entrada acima já contaram os resultados do teste. Esses dados são indicadores importantes em uma atividade de teste. Esses dados podem ser armazenados no banco de dados, integrados ao sistema de gerenciamento de informações de teste e, posteriormente, gerar painéis ou relatórios estatísticos para formar estável e O diagrama do circuito de teste do produto está relacionado ao desenvolvimento, então não vou descrevê-lo aqui.

Combinando os exemplos específicos acima, também podemos encontrar os objetos de implementação específicos correspondentes à parte teórica da seção anterior:

  • acessório de teste

    O trabalho de inicialização é feito pela função setUp e o trabalho de destruição é feito por tearDown

  • caso de teste

    Correspondente à classe TestCase ou mais detalhada correspondente à função de script de teste dentro

  • suíte de teste

    Correspondente à classe TestSuite

  • corredor de teste

    Correspondente à classe TextTestRunner

4 ferramentas IDE

Como a produtividade do desenvolvimento de código é necessária, é necessário introduzir uma ferramenta IDE -  Pycharm . É inegável que atualmente é o  IDE  de linguagem  Python mais dedicado/profissional  .  Também há melhor suporte para Pyunit .

O suporte principal é o seguinte:

  • Desenvolvimento de programação visual (este é o recurso básico do IDE)

  • Exibição visual dos resultados do teste

  • Exportar um relatório de teste que gera HTML

  • Execução de caso de uso de controle visual (isso é muito conveniente no estágio de desenvolvimento e depuração, pode controlar convenientemente a operação de unidades de código especificadas)

    • Deixe todos os comandos em um diretório serem executados
    • Deixe todos os casos de uso em um único arquivo serem executados
    • Faça um único comando em um único arquivo executar

4.1 Executando e depurando

O Pycharm  fornece suporte flexível de execução e depuração para scripts de teste.

Por meio do pycharm, os desenvolvedores podem realizar as seguintes funções sem escrever a função principal:

  • Execute todas as classes de teste em um arquivo
  • Execute todos os scripts de teste de uma classe de teste
  • Execute um script de teste de uma classe de teste

Entre eles,  "Executar um determinado script de teste de uma classe de teste"  é mais útil e é adequado para desenvolver, executar e depurar rapidamente um único script durante a fase de desenvolvimento.

Instruções:

  1. Mova o cursor dentro da função de teste
  2. Pressione a tecla de atalho de execução  ctrl+shift+F10  (esquema de teclas de atalho do Eclipse)

Se você deseja depurar com pontos de interrupção, use o modo de depuração para executar e depurar com pontos de interrupção para uma única função.

Obviamente, as funções acima também podem ser realizadas operando testSuit sem emprestar o IDE, mas o IDE fornece uma escolha mais flexível e direta. Essas são apenas algumas habilidades de uso do IDE, então não vou entrar em detalhes.

4.2 Visualização de Resultados

Para o exemplo mencionado acima, se você optar por executar este programa no IDE, verá os seguintes efeitos:

Você pode ver que todas as execuções foram aprovadas. Se um deles falhar deliberadamente, os seguintes resultados serão exibidos:

Acho que você gosta

Origin blog.csdn.net/caixiangting/article/details/131156902
Recomendado
Clasificación