[Teste automatizado] Introdução e casos do modelo PO

Índice

conceito

Modelo PO de três níveis:

1. Construa a camada básica do objeto BasePage

2. Construa a camada Página (camada de operação) da página inicial

3. Construa a camada de negócios

Métodos de afirmação comumente usados:

4. Crie conjuntos de casos de uso, execute arquivos e gere relatórios de testes automatizados

 Modelo de relatório de teste


conceito

O padrão de design PO (Page Object) é um padrão de design orientado a objetos (objeto de página) que encapsula objetos de teste e etapas de teste individuais em cada objeto de página e os gerencia em unidades de páginas.

vantagem

  1. Permite a reutilização de código
  2. Reduza os custos de manutenção
  3. Melhore a legibilidade do programa e a eficiência da escrita.
  4. Você pode separar o posicionamento da página e as operações de negócios, objetos de teste (objetos de elemento) e scripts de teste (scripts de caso de uso)
  5. Melhore a capacidade de manutenção dos casos de uso
Modo não PO Modo PO
Scripting linear orientado a processos O POM separa o posicionamento dos elementos da página e os processos de operação de negócios para obter um acoplamento flexível.
Fraca reutilização As alterações nos elementos da UI não exigem modificação do código da lógica de negócios. Você só precisa encontrar a página do pedido de compra correspondente e modificar o posicionamento. Os dados e o código são separados.
Má manutenção PO pode tornar o código mais legível, altamente reutilizável e de fácil manutenção

Modelo PO de três níveis:

É dividido principalmente em três camadas:
1. Camada base (camada da biblioteca de objetos): Alguns métodos públicos na página da página. Tais como: inicialização, posicionamento de elementos, clique, entrada, aquisição de texto, capturas de tela, etc.;
2. Camada de página (camada de operação): encapsula operações em elementos. Encapsule cada operação de elemento envolvido em um método de operação separadamente e, em seguida, monte as etapas da operação de acordo com as necessidades, como método de login = insira a conta + insira a senha + clique para fazer login em três operações para montar; 3. camada de scripts (camada de negócios) : guia a página da página de chamada
do pacote , use a estrutura de teste de unidade para encapsular e testar a lógica de negócios. Por exemplo: para implementar o login, basta chamar diretamente o método login da montagem da página.
A relação entre os três: a camada de página herda a camada base e a camada de scripts chama a camada de página.

Caso:

Introdução à estrutura do projeto:

Crie um projeto conforme mostrado abaixo

1. Construa a camada básica do objeto BasePage

Criar driver, pacote de driver do navegador

# encoding='UTF-8'
# 浏览器启动
from selenium import webdriver
def browser():
    driver=webdriver.Chrome()
    # driver.get("http://www.baidu.com")
    return driver

Crie o arquivo myuni.py e inicialize o pacote.

Defina uma classe de caso de teste que herda de unittest.TestCase

Defina setUp e tearDown. Esses dois métodos são iguais ao junit. Ou seja, se definido, o método setUp será executado antes de cada caso de teste ser executado, e o método tearDown será executado após a execução.

# encoding='UTF-8'
import unittest
from driver import *
class StartEnd(unittest.TestCase):
    def setUp(self):
        self.driver=browser()
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()

    def tearDown(self):
        self.driver.quit()

Criar arquivo function.py e função de captura de tela

# encoding='UTF-8'
import os
from selenium import webdriver

# 截图
def insert_img(driver,filename):
    func_path=os.path.dirname(__file__)
    # print(func_path)
    base_dir=os.path.dirname(func_path)
    # print(base_dir)
    # 将路径转化为字符串
    base_dir=str(base_dir)
    # 对路径的字符串进行替换
    base_dir=base_dir.replace("\\","/")
    # print(base_dir)
    # 获取项目文件的要目录路径
    base=base_dir.split('/Website')[0]
    # print(base)
    # 指定截图存放路径(注意路径最后要加/)
    filepath=base+'/Website/test_report/screnshot/'+filename
    driver.get_screenshot_as_file(filepath)

if __name__=='__main__':
    driver=webdriver.Chrome()
    driver.get("http://www.sogou.com")

2. Construa a camada Página (camada de operação) da página inicial

Crie o arquivo BasePage.py para determinar se a página aberta é a página esperada

# encoding='UTF-8'
from time import sleep

class Page():
    def __init__(self,driver):
        self.driver=driver
        self.base_url="http://localhost"
        self.timeout=10

    def _open(self,url):
        url_=self.base_url+url
        # print("这个页面url是:%s"%url_)
        self.driver.maximize_window()
        self.driver.get(url_)
        # sleep(2)
        assert self.driver.current_url==url_,'这不是我们想要的地址'

    def open(self):
        self._open(self.url)

    def find_element(self,*loc):
        return self.driver.find_element(*loc)

Crie o arquivo LoginPage.py e o encapsulamento de posicionamento do elemento da página

# encoding='UTF-8'
from BasePage import *
from selenium.webdriver.common.by import By

class LoginPage(Page):
    url='/news/'

    username_loc=(By.NAME,'username')
    password_loc=(By.NAME,'password')
    submit_loc=(By.NAME,'Submit')

    def type_username(self,username):
        self.find_element(*self.username_loc).send_keys(username)
    def type_password(self,password):
        self.find_element(*self.password_loc).send_keys(password)
    def type_submit(self):
        self.find_element(*self.submit_loc).click()

    def login_action(self,username,password):
        self.open()
        self.type_username(username)
        self.type_password(password)
        self.type_submit()

    loginPass_loc=(By.LINK_TEXT,'我的空间')
    loginErr_loc=(By.LINK_TEXT,'加入收藏')

    def type_loginPass_hint(self):
        return self.find_element(*self.loginPass_loc).text

    def type_loginErr_hit(self):
        return self.find_element(*self.loginErr_loc).text

3. Construa a camada de negócios

  1. Crie o arquivo test_login.py
  2. Função: função, myunit, LoginPage
  3. Crie a classe LoginTest, herde myunit.StartEnd e inicialize o método
  4. Defina um caso de teste com um nome começando com teste. Unittest colocará automaticamente o método começando com teste no conjunto de casos de teste.
  5. Para implementar o login, chame o método de login montado por LoginPage, insira o nome de usuário, senha, clique em login, afirme e faça capturas de tela
# encoding='UTF-8'
import unittest
from model import function,myunit
from page_object.LoginPage import *
from time import sleep

class LoginTest(myunit.StartEnd):
    def test_login1_normal(self):
        print("test_login1_normal测试开始")
        po=LoginPage(self.driver)
        po.login_action("yuruyi","12345678")
        sleep(5)
        self.assertEqual(po.type_loginPass_hint(),'我的空间')
        function.insert_img(self.driver,"login_normal.png")
        print("test_login1_normal执行结束")

    def test_login2_PasswdError(self):
        print("test_login2_PasswdError测试开始")
        po=LoginPage(self.driver)
        po.login_action("yuruyi","1234567")
        sleep(5)
        self.assertEqual(po.type_loginErr_hit(),'加入收藏')
        function.insert_img(self.driver,"login_Err.png")
        print("test_login2_PasswdError执行结束")

    def test_login3_empty(self):
        print("test_login3_empty测试开始")
        po = LoginPage(self.driver)
        po.login_action("", "")
        sleep(5)
        self.assertEqual(po.type_loginErr_hit(), '加入收藏')
        function.insert_img(self.driver, "login_empty.png")
        print("test_login3_empty执行结束")

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

Métodos de afirmação comumente usados:

4. Crie conjuntos de casos de uso, execute arquivos e gere relatórios de testes automatizados

Quando há muitos casos de teste e arquivos de teste, é muito conveniente usar um arquivo de execução de teste principal unificado para executar casos de teste, o que requer a combinação do método de descoberta e do TextTestRunner.

# encoding='UTF-8'
import unittest
# 测试报告模板
from HTMLTestRunnerCN import HTMLTestRunner
import time

report_dir='./test_report'
test_dir='./test_case'

print("start run test case")
discover=unittest.defaultTestLoader.discover(test_dir,pattern="test_login.py")

now=time.strftime("%Y-%m-%d %H_%M_%S")
report_name=report_dir+'/'+now+'result.html'

print("start write report..")
#使用runner运行器运行测试集
with open(report_name,'wb')as f:
    runner=HTMLTestRunner(stream=f,title="Test Report",description="localhost login test")
    runner.run(discover)
    f.close()
print("Test end")

 Modelo de relatório de teste

 


A seguir estão recursos tutoriais de aprendizagem relativamente bons que coletei. Embora não sejam muito valiosos, se acontecer de você precisar deles, você pode deixar uma mensagem na área de comentários [777] e simplesmente retirá-los.

 

Amigos que desejam obter informações, curtam + comentem + coletem , três vezes seguidas!

Após três rodadas consecutivas , enviarei mensagens privadas uma por uma na área de comentários ~

Acho que você gosta

Origin blog.csdn.net/m0_70618214/article/details/132763950
Recomendado
Clasificación