Informe de prueba (avanzado)

Las pruebas funcionales pueden escribir un informe de prueba a mano

1. Cómo generar automáticamente informes de prueba

unittest genera informes de prueba

Caso de prueba: la cuenta es correcta, la contraseña es incorrecta

Ingrese un conjunto de números de cuenta de acuerdo con el caso de prueba, haga clic en iniciar sesión y aparecerá un mensaje, la contraseña es incorrecta

código:

import unittest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 必须要继承unittest.TestCase
class TestCase(unittest.TestCase):

    # setUP 用例执行前要执行的一个方法
    def setUp(self) -> None:
        # 登录的准备工作:打开浏览器,访问登录页
        # 通过浏览器驱动打开谷歌浏览器
        self.driver = webdriver.Chrome()
        # 访问登录页
        self.driver.get('http://39.98.138.157/shopxo/index.php?s=/index/user/logininfo.html')

    # tearDown 用例执行之后要执行的一个方法
    def tearDown(self) -> None:
        # 关闭浏览器,一般会等待三秒钟关闭浏览器
        # alt+enter 自动导包
        time.sleep(4)
        self.driver.quit()

    # 测试过程  测试方法  一条测试用例就是一条test 一个方法必须以test开头
    # 用户名正确。密码不正确
    def test_01(self):
        # 找到输入框,输入用户名
        # 找到输入框,输入密码
        # 找到登录按钮并点击登录
        self.driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/div[2]/form/div[1]/input').send_keys('666666')
        self.driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/div[2]/form/div[2]/input').send_keys('633333')
        self.driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/div[2]/form/div[3]/button').click()
        # 预期结果
        # expected='密码错误'
        # 做断言
        # 一般而言使用if expected ==
        # unittest提供了断言
        time.sleep(1)
        msg=self.driver.find_element(By.XPATH, '//*[@id="common-prompt"]/p').text
        self.assertEqual('密码错误', msg)

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

Consideraciones: Afirmar --Buscar errores de contraseña

2. Optimice la generación automática de informes de prueba unittest

Pytest se profundiza sobre la base de unittest, será más fácil de usar y la dificultad de aprendizaje será mayor

1. unittest genera un informe de prueba

Para resolver el problema, importe el paquete os,

Documento de referencia: ​​​​Mensaje de error: ImportError: el directorio de inicio no se puede importar: 'D:\\PyCharm-Workspace\\testcases' - 喵喵 kmm - 博客园

 respuesta correcta:

Descripción: testCase20211214 es el directorio raíz

        La salida de la consola también es un informe de prueba alternativo, pero no es completo y es difícil de entender.

2. unittest tiene un método único para generar informes de prueba de texto

 

El problema anterior se debe principalmente a que la ruta está mal escrita, busque directamente el directorio raíz para crear el archivo

respuesta correcta:

resultado de ejecución:

El test_01, test_02 anterior abrirá un nuevo navegador cada vez que se ejecute

3. Complemento, instalación de html testrunner

html testrunner es una actualización para el informe de prueba generado automáticamente por unittest

1) Descargar htmlTestRunner

HTMLTestRunner - software de tungwaiyip

Nota: si hay un problema con htmltestrunner, puede modificarlo de acuerdo con el siguiente plan de modificación

htmlTestRunner.py solo admite python2, python3 no es compatible con python2

2) Verifique la versión de python

3) Ponga htmltestrunner debajo de lib

4) Use HtmlTestRunner.py para implementar el informe de prueba

5) Efecto de ejecución: el archivo html debe abrirse con un navegador

6) Hay un problema, la operación falla y no aparece el informe de la prueba

  1. 6.1) Comprobar si el archivo HtmlTestRunner.py está mal

Python+Selenium+HTMLTestRunner genera automáticamente un informe de prueba, pero la solución está en blanco cuando se abre

Documentos de referencia:

Python+Selenium+HTMLTestRunner genera automáticamente un informe de prueba, pero la solución está en blanco cuando se abre - Wanqing lazy blog - CSDN blog

En el proceso de prueba, el paso más importante es la generación de informes de prueba, y las pruebas automatizadas también necesitan generar informes de prueba automáticamente. Pero unittest no puede generar informes en formato html, lo que requiere importar un módulo de terceros: HTMLTestRunner.

Uno: Descargar HTMLTestRunner

Ruta de descarga: https://pypi.python.org/pypi/HTMLTestRunner, después de la descarga, colóquelo en el directorio de instalación de Python\directorio Lib.

El archivo HTMLTestRunner.py en Descargar es el paquete que necesitamos descargar. Si solo puede abrir este archivo después de hacer clic, puede copiar el contenido del archivo en el Bloc de notas y guardarlo como HTMLTestRunner.py.

2. Modifique el archivo HTMLTestRunner.py

Si instaló la versión python2, no necesita realizar este paso. Debido a que HTMLTestRunner.py es originalmente la versión de python2 y aún no se ha encontrado la versión de python3, debemos modificar el archivo HTMLTestRunner.py nosotros mismos.

La modificación es la siguiente:

Línea 94, modifique import StringIO para importar io

Línea 539, modifique self.outputBuffer = StringIO.StringIO() a self.outputBuffer = io.StringIO()

Línea 642, cambie si no es rmap.has_key(cls): a si no es cls en rmap:

Línea 766, cambie uo = o.decode('latin-1') a uo = e

Línea 774, cambie ue = e.decode('latin-1') a ue = e

Línea 631, cambie print >> sys.stderr, '\nTiempo transcurrido: %s' % (self.stopTime-self.startTime) a print(sys.stderr, '\nTiempo transcurrido: %s' % (self.stopTime- self.startTime))

Entre ellos, en Python3, ya no hay StringIO. En su lugar, utilice io.StringIO.

  1. 6.2) Después de confirmar que la modificación de htmltestrunner es correcta, continúa ejecutándose y generando un informe, pero aún está en blanco cuando se abre

Posible motivo uno: el archivo no está cerrado, simplemente agregue el código fp.close().

Posible motivo 2: utilicé el método de prueba de unidad de Python para ejecutar y luego cambié a Python Run para generar el informe normalmente después de ejecutar

7) Agrega el código fp.close() para ejecutar

Por necesita ser importado por adelantado

de selenium.webdriver.common.by import Por

错误 “AttributeError: el objeto 'builtin_function_or_method' no tiene el atributo 'sleep'”

Programación de Python, encontré este error cuando usé time.sleep(n) para suspender la función

Motivo: El uso de la importación es desde el momento de la importación *

Solución: reemplace la importación con el tiempo de importación

Documentos de referencia:

Error de Python: error "AttributeError: el objeto 'builtin_function_or_method' no tiene el atributo 'sleep'" - Blog de Xuelan Lingying - Blog de CSDN

8) Volver a ejecutar 

Documento de referencia: Varios métodos para resolver NoSuchElementException: No se puede ubicar el elemento (NoSuchElementException: No se puede ubicar el elemento)

El análisis puede ser un error causado por un tiempo de carga insuficiente, porque el navegador se ha cerrado cuando se ejecuta la aserción.

 time.sleep(10): si extiende el tiempo de espera, ¿saltará a los cursos de Tencent?

 time.sleep(3) informará un error

Sin afirmaciones, sin errores.

Intenta hacerlo más largo

Error:

selenium.common.exceptions.SessionNotCreatedException: Mensaje: sesión no creada: esta versión de ChromeDriver solo es compatible con la versión 92 de Chrome
La versión actual del navegador es 101.0.4951.67 

El motivo es: la versión del navegador es inconsistente, debe ser que el navegador se ha actualizado automáticamente

9) Python informó TypeError: el objeto 'str' no es una solución de error invocable

Documentos de referencia:

Python informó TypeError: el objeto 'str' no es una solución de error invocable - python - web tutorial network

Averigua porque:

Ejemplo 3: error de llamada de función o cadena

def get_list_urls(auto):

para la lista en self.domainList:

#print(self.domainList[lista])

url = self.domainList[lista]

reqs = solicitudes.get(url = url, encabezados = self.headers)

html = requisitos.texto()

bfHtml = HermosaSopa(html)

El ejemplo anterior también informará: el objeto 'str' no se puede llamar

La razón es: el valor de retorno de las solicitudes no tiene un método text(), BeautifulSoup recibe una cadena y escribimos por error reqs.text como reqs.text(), lo que provocó este error.

Código modificado a continuación: 

10) Código completamente modificado:

import unittest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

#必须要继承unittest.TestCase
class TestCase(unittest.TestCase):

#setUP用例执行前要执行的一个方法
def setUp(self)->None:
#登录的准备工作:打开浏览器,访问登录页
#通过浏览器驱动打开谷歌浏览器
self.driver=webdriver.Chrome()
#访问登录页
self.driver.get('http://39.98.138.157/shopxo/index.php?s=/index/user/logininfo.html')

#tearDown用例执行之后要执行的一个方法
def tearDown(self)->None:
#关闭浏览器,一般会等待三秒钟关闭浏览器
#alt+enter自动导包
time.sleep(4)
self.driver.quit()

#测试过程测试方法一条测试用例就是一条test一个方法必须以test开头
#用户名正确。密码不正确
def test_01(self):
#找到输入框,输入用户名
#找到输入框,输入密码
#找到登录按钮并点击登录
self.driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[1]/input').send_keys('666666')
self.driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[2]/input').send_keys('633333')
self.driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[3]/button').click()
#预期结果
#expected='密码错误'
#做断言
#一般而言使用ifexpected==
#unittest提供了断言
time.sleep(1)
msg=self.driver.find_element(By.XPATH,'//*[@id="common-prompt"]/p').text
self.assertEqual('密码错误',msg)

if__name__=='__main__':
unittest.main()

Nota: no se puede omitir time.sleep(1)

Se puede optimizar más tarde, para que pueda esperar a tiempo.

11) Informe de error de ejecución

AttributeError: el objeto 'str' no tiene atributo 'decode' solución

Documentos de referencia:

AttributeError: el objeto 'str' no tiene atributo 'decode' solution_Lemon no es mi lindo blog-CSDN blog

 El motivo del análisis es la diferencia entre pyhon2 y python3

12) Después de completar la modificación

 13) Ejecución

1. unittest viene con un informe de prueba

2. El informe de prueba generado por htmlTextRunner.py es un código html cuando pycharm lo abre

 

 3. Continúe optimizando el informe de prueba

Documentos de referencia:

Python3 Fecha y hora | Tutorial para principiantes

 El informe de prueba se genera en el lugar equivocado y la ruta es incorrecta

Así el camino está donde yo quiero

Código completo:

import os
import time
import unittest
import HTMLTestRunner

#找到用例defaultTestLoader默认加载
#discover发现,找
#discover(self,start_dir目录,pattern='test*.py'用例文件,top_level_dir=None):
base_dir=os.path.dirname(os.getcwd())

#dict_dir='testCase20211214'
#unittest*.py执行目录下面以unittest开头的文件都可以执行
#找到用例
discover=unittest.defaultTestLoader.discover(base_dir,'unittest*.py')
#将测试报告转成文本的方式
#withopen('./report.txt','w')asf:
##执行用例TextTestRunner以文本形式展示用例run运行可以批量执行用例stream=f写入verbosity012测试报告的详细程度2表示详细
#unittest.TextTestRunner(stream=f,verbosity=2).run(discover)
#二进制wb
#withopen('./report1.html','wb')asf:
#HTMLTestRunner.HTMLTestRunner(stream=f,verbosity=2).run(discover)

#优化用时间命名测试报告测试报告生成时间+后缀码2021-11-1621-10-20test_report.html
now=time.strftime('%Y-%m-%d-%H-%M-%S')
report_name='./report'+'/'+now+'test_report.html'
withopen(report_name,'wb')asf:
HTMLTestRunner.HTMLTestRunner(stream=f,verbosity=2).run(discover)
f.close()

 

El foco de la optimización es: se generará un informe de prueba cada vez que se ejecute, y cada informe de prueba tiene un tiempo de ejecución, por lo que no será como los dos casos anteriores, y el informe de prueba que aparecerá en la ejecución posterior será cubrir el informe de prueba anterior

 4. Continúe optimizando y expandiendo:

1. El informe de prueba generado por HTMLtextrunnerCN.py es mejor que HtmlTestRunner

2, BSTestRunner.py

3. Plataforma de informe de prueba Allure

La diferencia entre el informe de prueba es si se ve bien o no, y cuáles se ven mejor. Mostrárselo a los líderes y colegas los hace sentir bien.

La dirección de la expansión personal: por ejemplo

La ejecución del caso de uso es incorrecta, agregue una captura de pantalla

3. Puntos de conocimiento

no se puede usar find_element_by_xpath

solución:

find_element_by_* ha quedado en desuso use find_element en su lugar

Documentos de referencia:

http://blog.sina.com.cn/s/blog_53a99cf301030fv4.html

redacción original

browser.find_element_by_class_name("sort-area")

browser.find_element_by_xpath("//*[texto()='clasificación de tiempo']")

forma actual de escribir

browser.find_element(By.CLASS_NAME,"sort-area")

browser.find_element(By.XPATH,"//*[text()='time sorting']")

código fuente:

使用find_element代替

def find_element(self,by=By.ID,value=None)->WebElement:
"""
FindanelementgivenaBystrategyandlocator.

:Usage:
::

element=driver.find_element(By.ID,'foo')

:rtype:WebElement
"""
if isinstance(by,RelativeBy):
return self.find_elements(by=by,value=value)[0]

if by==By.ID:
by=By.CSS_SELECTOR
value='[id="%s"]'%value
elif by==By.TAG_NAME:
by=By.CSS_SELECTOR
elif by==By.CLASS_NAME:
by=By.CSS_SELECTOR
value=".%s"%value
elif by==By.NAME:
by=By.CSS_SELECTOR
value='[name="%s"]'%value

return self.execute(Command.FIND_ELEMENT,{
'using':by,
'value':value})['value']

Supongo que te gusta

Origin blog.csdn.net/Lynn1111111/article/details/124861058
Recomendado
Clasificación