Evitando Inicialização Repetida em Testes com Appium e Python ao Usar Múltiplas Classes

Em testes automatizados com Appium e Python, dividir o código em classes distintas melhora a manutenção. No entanto, cada classe pode inicializar o driver, reiniciando o aplicativo a cada execução, o que é ineficiente. Utilizar o padrão singleton através do método __new__ permite reutilizar a instância do driver entre diferentes classes.

Implemente a solução com uma classe que gerencia o driver:

# gerenciador_driver.py
# Configuração do driver usando singleton

from appium import webdriver
from config.parametros_globais import nome_pacote_aplicativo, nome_dispositivo


class GerenciadorDriver(object):
    def __new__(cls, *args, **kwargs):
        """
        Aplica o padrão singleton para garantir uma única instância do driver.
        Assim, objetos de outras classes compartilham a mesma sessão do Appium.
        """
        if not hasattr(cls, '_instancia'):
            capacidades = {}
            capacidades['platformName'] = 'Android'
            capacidades['platformVersion'] = '8.1.0'
            capacidades['appPackage'] = nome_pacote_aplicativo
            capacidades['appActivity'] = '.atividade_principal'
            capacidades['unicodeKeyboard'] = 'true'
            capacidades['resetKeyboard'] = 'true'
            capacidades['newCommandTimeout'] = '180'
            capacidades['deviceName'] = nome_dispositivo
            capacidades['noReset'] = True
            instancia_base = super(GerenciadorDriver, cls)
            cls._instancia = instancia_base.__new__(cls)
            cls._instancia.driver = webdriver.Remote(
                "http://localhost:4723/wd/hub", capacidades
            )
        return cls._instancia


class ClienteDriver(GerenciadorDriver):
    def obter_driver(self):
        return self.driver

Para utiilzar em outros arquivos, crie uma instância única do cliente:

# teste_sistema.py
import unittest
import time
import warnings
from src.paginas import pagina_login
from src.comum import gerenciador_driver, operador_gestos
from config.parametros_globais import nome_usuario_login, senha_login


class TesteLogin(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        warnings.simplefilter("ignore", ResourceWarning)
        cls.driver = gerenciador_driver.ClienteDriver().obter_driver()
        cls.operador_gestos = operador_gestos.ManipuladorGestos()

    def testar_login(self):
        pagina = pagina_login.PaginaLogin(self.driver)
        pagina.inserir_usuario(nome_usuario_login)
        pagina.inserir_senha(senha_login)
        pagina.clicar_botao_login()
        time.sleep(3)


class TesteModulo(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = gerenciador_driver.ClienteDriver().obter_driver()

    @classmethod
    def tearDownClass(cls):
        gerenciador_driver.ClienteDriver().obter_driver().quit()

    def testar_navegacao_modulo(self):
        from src.paginas import pagina_modulo
        modulo = pagina_modulo.PaginaModulo(self.driver)
        modulo.clicar_menu_sistema()
        modulo.clicar_submenu_produtos()


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

Ao executar os testes, o driver é inicializado apenas uma vez, reuitlizado em todas as classes, evitando reinícios desnecessários do aplicativo.

Tags: Appium Python singleton Testes Automatizados WebDriver

Publicado em 6-2 22:50 por Thomas