Estrutura de teste de unidade Python (firmware de teste, execução em lote)

estrutura de teste python

As estruturas de teste de unidade mais usadas na linguagem Python são unittest e pytest. unittest pertence à biblioteca padrão e pode ser importado e usado diretamente, desde que o interpretador Python esteja instalado. pytest é uma biblioteca de terceiros que precisa ser instalada separadamente.

1. Princípio de teste de caixa branca

No nível da arquitetura de software, a etapa principal do teste está no processo de desenvolvimento de software. No que diz respeito ao próprio software, o comportamento ou função do software é o produto da implementação dos detalhes do software, que são finalmente entregues ao usuário. Portanto, um sistema que realiza testes desde o início tem o potencial de ser um sistema testável e robusto que resulta em funcionalidade geralmente satisfatória para os usuários. Então, dada essa perspectiva, a melhor forma de começar a fazer testes é a partir do código-fonte, que é onde o software foi escrito e quem o desenvolveu. Como o código-fonte é visível para os desenvolvedores, esse processo de teste pode ser chamado de teste de caixa branca

2. Escreva casos de teste automatizados

 

3.unidade de combate real

   Introdução a cada componente do unittest

  • caso de teste testCase: Depois que a classe de teste herda a classe TestCase no módulo unittest, uma nova classe de caso de teste e método de teste são definidos de acordo com a classe herdada.
  • Firmware de teste: o firmware de teste representa a configuração ou preparação necessária para um caso de teste ou vários testes e limpeza. A inicialização faz sentido
  • suíte de testes testSuite: Como o nome indica, uma suíte de testes é uma coleção de casos de teste relacionados. No unittest, o suporte para suítes de teste é fornecido principalmente por meio da classe TestSuite.
  • testRunner Test Run: Um objeto que gerencia e executa casos de teste.
  • assert test assertion: verifica a asserção do objeto testado com base no resultado real retornado e no resultado esperado
  • Resultado do teste: A classe de resultado do teste gerencia a saída do resultado do teste e o resultado do teste é apresentado ao usuário final para feedback das informações do resultado dessa execução do teste.

Os elementos do caso de teste automatizado incluem:

1. Pré-condição setUp()

2. Etapas de teste

3. Verificação do resultado

4. Limpe tearDown()

4. Explicação detalhada do firmware de teste unitário:

O método de teste de firmware no teste unitário pode ser dividido em dois métodos de execução. Um é executar o firmware de teste apenas uma vez e o outro é executar o firmware de teste todas as vezes. A seguir serão explicados os dois com base em casos específicos.

1. O firmware de teste é executado sempre

from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://haokan.baidu.com/?sfrom=baidu-top'))

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))

if __name__ == '__main__':
    unittest.main(verbosuty=2)

Após a execução do código acima, sua sequência é: test firmware --> test case, test firmware --> test case

2. O firmware de teste é executado apenas uma vez

É utilizado o método class, de forma que o firmware de teste será executado apenas uma vez, veja o código do caso:

from selenium import webdriver
import unittest

class BaiduTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

        unittest.main(verbosity=2)

5. Explicação detalhada da sequência de execução do caso de teste

No unittest, a ordem de execução dos pontos de teste é executada de acordo com o código ascill, ou seja, de acordo com a ordem de carregamento do código ASCII, a ordem dos números e letras é: 0-9, AZ, az, então o teste método case começando com A Será executado primeiro, e será executado depois de começar com a. Ou seja, é executado de acordo com o tamanho do número de pequeno para grande. Lembre-se que o valor do tamanho do número não inclui o teste, e o valor é o tamanho do número do ponto de teste após o teste .

6. Explicação detalhada da verbosidade

No unittest, o padrão é 1 durante a execução, que é unittest.main(verbosity=1). Existem três parâmetros em verbosidade, que são 0, 1 e 2. Os significados são os seguintes:

0 (modo silencioso): obtém apenas o número total de casos de teste e os resultados totais

1 (modo padrão)

2 (modo detalhado): os resultados do teste exibirão todas as informações relevantes para cada caso de teste

7. Notas sobre os casos de teste:

            1. Em uma classe de teste, cada método de teste começa com test. test não pode estar no meio ou no final, mas deve estar no início. Recomenda-se test_

    2. Cada método de caso de teste deve ter informações de comentários, de modo que o ponto de verificação do ponto de teste específico seja exibido no relatório de teste

    3. Nos testes automatizados, cada caso de teste deve ter asserções, e os casos de teste automatizados sem asserções são inválidos

    4. É melhor que um método de caso de teste corresponda a um ponto de teste de negócios e não escreva um caso de teste para vários pontos de verificação de negócios

    5. Se envolver processamento de lógica de negócios, é melhor colocar o método de processamento de lógica de negócios na frente da asserção. O objetivo disso é evitar que a asserção falhe devido a erros de execução da lógica de negócios

    6. O nome do caso de teste deve ser padronizado e restrito

    7. Quer escrever o código de teste do teste automatizado primeiro, acho desnecessário usar o método de teste automatizado para escrever, afinal quem pode fazer o teste automatizado tem o nível básico de teste funcional, então não há É necessário escrever o ponto de verificação de uma empresa várias vezes, desperdiçando tempo e custos de mão de obra.

8. Detalhes do pacote de teste

Executar por classe de teste

from selenium import webdriver
import unittest

class BaiduTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

if __name__ == '__main__':
    # #按测试类来进行执行 调用TestLoader()当中的loadTestsFromTestCase的方法
    suite=unnittest.TestLoader().loadTestsFromTestCase(baiduTest)
    unnitest.TextTestRunner().run(suite)

Executar por módulo de teste:

from selenium import webdriver
import unittest

class BaiduTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

if __name__ == '__main__':
    # 按模块来进行执行
    suite = unnittest.TestLoader().loadTestsFromModule('test_baidu_class.py')
    unnitest.TextTestRunner().run(suite)

9. Execute todos os casos de teste em lotes

import unittest
import os

def getTests():
    '''加载所有的测试模块'''
    suite=unittest.TestLoader().discover(
        #找到被执行模块的路径
        start_dir=os.path.dirname(__file__),
        #加载路径下所有以test_开头的测试模块的文件
        pattern='test_*.py' #正则表达式
    )
    return suite

def runSuite():
    unittest.TextTestRunner().run(getTests())

runSuite()

Acho que você gosta

Origin blog.csdn.net/MXB1220/article/details/132261195
Recomendado
Clasificación