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()