Pruebas automatizadas: ejercicio de posicionamiento de elementos del sistema de gestión de comercio electrónico

En este tema, hablemos sobre el uso del marco Unittest en Python y cómo realizar la generación automática de informes de prueba automatizados a través de HTMLTestRunner. Todavía utilizamos el "sistema de gestión de comercio electrónico" implementado en el aprendizaje en el aula para implementar el código en el caso. Este ejercicio incluye las siguientes operaciones:

l El diseño de la estructura general del caso de prueba.

l Realización de casos de prueba.

l Organización de conjuntos de pruebas y generación de informes de prueba.

1. El diseño de la estructura general del caso de prueba.

Unittest, anteriormente conocido como PyUnit, se deriva de JUnit de Java para escribir y ejecutar pruebas repetibles. Basado en el mecanismo de aserción para juzgar si el resultado real de la función o método es consistente con el resultado esperado, el caso de prueba proporciona parámetros para ejecutar la función o método, obtiene los resultados de su ejecución y luego usa el método de aserción para juzgar si el resultado real de la función o método es consistente con el resultado esperado. la salida de la función o método es consistente con la expectativa Si los resultados de salida son consistentes, si son consistentes, se pasa la prueba; si son inconsistentes, no se pasa la prueba.

Unittest requiere que la clase de prueba unitaria herede TestCase, y los métodos de prueba en esta clase deben comenzar con test, sin parámetros ni valores de retorno. Además, se pueden agregar dos funciones especiales, setUp() y tearDown(), a la prueba unitaria para implementar acciones específicas antes y después de llamar a un método de prueba, donde setUp se ejecuta antes de llamar a la función de prueba y tearDown se ejecuta después. .

Primero escribimos un caso de prueba para la función de inicio de sesión. La estructura del código es la siguiente. La demostración incluye tres métodos de prueba:

inserte la descripción de la imagen aquí

2. Realización de casos de prueba.

A continuación completamos la implementación del contenido del caso de prueba. De acuerdo con la estructura anterior, se implementan un total de dos casos de prueba, uno es un caso de prueba de inicio de sesión y el otro es un caso de prueba para agregar tipos de productos.

Caso de prueba de inicio de sesión. Aquí, las funciones de apertura y cierre de la página de inicio de sesión del sistema se encapsulan respectivamente en las funciones de configuración y desmontaje, de modo que la página de inicio de sesión se abrirá automáticamente antes y después de la ejecución de cada método posterior, y la página de inicio de sesión se cerrará después del se ejecuta la prueba.

El código se implementa de la siguiente manera:

import unittest
from time import sleep
from selenium import webdriver


# 登录测试用例
class LoginTest(unittest.TestCase):
 # 每执行一个测试方法前,先打开登录页面
 def setUp(self):
 self.driver = webdriver.Firefox()
 self.driver.implicitly_wait(10)
 self.driver.get('http://39.96.181.61/qftest-ds/index.php?m=backend&c=main&a=index')

 # 每执行一个测试方法后,关闭浏览器
 def tearDown(self):
 self.driver.quit()

 # 测试方法1:无效用户名登录测试
 def test_01_invalid_username(self):
 self.driver.find_element_by_id("username").send_keys('abcdefg')
 self.driver.find_element_by_id("password").send_keys('qftestxxxxx')
 self.driver.find_element_by_link_text('登 陆').click()
        sleep(2)
 # 断言:如果登录失败,应该显示提示信息,包含文字:"错误的用户名或密码"
 self.assertIn('错误的用户名或密码', self.driver.page_source)

 # 测试方法2:无效密码登录测试
 def test_02_invalid_password(self):
 self.driver.find_element_by_id("username").send_keys('admin')
 self.driver.find_element_by_id("password").send_keys('123456')
 self.driver.find_element_by_link_text('登 陆').click()
        sleep(2)
 # 断言:如果登录失败,应该显示提示信息,包含文字:"错误的用户名或密码"
 self.assertIn('错误的用户名或密码', self.driver.page_source)

 # 测试方法3:有效用户名和密码登录测试
 def test_03_valid(self):
 self.driver.find_element_by_id("username").send_keys('admin')
 self.driver.find_element_by_id("password").send_keys('qftestxxxxxx')
 self.driver.find_element_by_link_text('登 陆').click()
        sleep(2)
 # 断言:如果登录成功,应该进入系统桌面,包含文字:"常用菜单"
 self.assertIn('常用菜单', self.driver.page_source)


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

增加商品类型测试用例。这里将系统登录和退出及关闭浏览器功能分别封装进setUp和tearDown函数内部,这样后续每个方法执行的前后会自动完成登录并在测试执行之后退出和关闭登录页面。
代码实现如下:
import random
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.select import Select


# 增加商品分类测试用例
class AddTypeTest(unittest.TestCase):

 def setUp(self):
 self.driver = webdriver.Firefox()
 self.driver.implicitly_wait(10)
 self.driver.get('http://39.96.181.61/qftest-ds/index.php?m=backend&c=main&a=index')
 self.driver.find_element_by_id("username").send_keys('admin')
 self.driver.find_element_by_id("password").send_keys('qftestxxxxxxx')
 self.driver.find_element_by_link_text('登 陆').click()
        sleep(3)

 def tearDown(self):
 self.driver.switch_to.default_content()
 self.driver.find_element_by_link_text("退出登录").click()
        sleep(2)
 self.driver.quit()

 # 测试方法1:是否可要正确打开商品分类页面
 def test_01_open_type(self):
        sleep(5)
 # 依次点击目录:商品管理 - 商品分类
 self.driver.find_element_by_xpath('/html/body/div[5]/div[1]/div[2]/h3/a').click()
 self.driver.find_element_by_partial_link_text('商品分类').click()
        sleep(5)
 # 切换到内部 iframe
 self.driver.switch_to.frame('main')
 # 断言:如果打开商品分类页面成功,应该包含显示文字:"分类名称"
 self.assertIn('分类名称', self.driver.page_source)

 # 测试方法2:是否可要新增商品分类,并且添加成功
 def test_02_add_type(self):
        sleep(5)
 # 依次点击目录:商品管理 - 商品分类
 self.driver.find_element_by_xpath('/html/body/div[5]/div[1]/div[2]/h3/a').click()
 self.driver.find_element_by_partial_link_text('商品分类').click()
        sleep(5)
 self.driver.switch_to.frame('main')
 # 点击“新增分类”按钮
 self.driver.find_element_by_xpath('/html/body/div/div[2]/div[1]/a[1]/font').click()
        sleep(1)

 # 输入分类名称
 self.driver.find_element_by_id('cate_name').send_keys('奥里给')
        sleep(1)

 # 从下拉列表中随机选择一个上级分类
 father_type = self.driver.find_element_by_id('parent_id')
        father_type_opts = Select(father_type).options
        rom = random.randint(0, len(father_type_opts) - 1)
        Select(father_type).select_by_index(rom)
        sleep(1)

 # 点击“保存并提交”按钮
 self.driver.find_element_by_css_selector('html body div.content form div.box div.submitbtn button.ubtn.btn').click()
        sleep(5)

 # 断言:新增的分类名称,应该显示在返回的分类表格页面中
 self.assertIn('奥里给', self.driver.page_source)


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

3. Organización de conjuntos de pruebas y generación de informes de prueba.

Para la ejecución de casos de prueba, utilizamos la clase de conjunto de pruebas TestSuite en unittest. A partir de su definición de clase, se puede entender que múltiples casos de prueba independientes (casos de prueba) pueden formar un conjunto de pruebas.

Si desea que los casos de prueba se ejecuten en secuencia, debe utilizar el método addTest de la clase TestSuite. Después de llamar al método addTest, los que se agreguen primero se ejecutarán primero y los que se agreguen más tarde se ejecutarán más tarde. Pero me gustaría llamar su atención aquí. En PyCharm, el método addTest no funciona. La razón es que en PyCharm, se introduce el módulo unittest y se ejecutará en modo unittest de forma predeterminada. En este momento, el unittest El modo debe convertirse al modo normal.

Cuando realizamos pruebas automatizadas, esperamos generar un hermoso informe de prueba para mostrar los resultados de la ejecución del caso de prueba. Aquí usamos HTMLTestRunner para lograrlo. HTMLTestRunner es una extensión del módulo unittest de la biblioteca estándar de Python. Genera informes de prueba HTML fáciles de usar.

El código se implementa de la siguiente manera:

import unittest
from HTMLTestRunner import HTMLTestRunner
from F01_login_test import LoginTest
from F02_add_type_test import AddTypeTest


# 定义测试套(包含要运行的测试用例及方法)
def test_suite():
    suite = unittest.TestSuite()

    # 添加第一个测试用例及所属测试方法
    suite.addTest(LoginTest('test_01_invalid_username'))
    suite.addTest(LoginTest('test_02_invalid_password'))
    suite.addTest(LoginTest('test_03_valid'))

    # 添加第二个测试用例及所属方法
    suite.addTest(AddTypeTest('test_01_open_type'))
    suite.addTest(AddTypeTest('test_02_add_type'))

    return suite


if __name__ == '__main__':
    # 设置测试报告输出文件
    with open('./test_report.html', 'wb') as f:
        runner = HTMLTestRunner(stream=f,
                                title="自动化测试报告",
                                description="电商系统自动化测试报告")
        # 运行测试套
        runner.run(test_suite())

Finalmente me gustaría agradecer a todos los que han leído atentamente mi artículo, la reciprocidad siempre es necesaria, aunque no es algo muy valioso, puedes quitártelo si lo necesitas:

inserte la descripción de la imagen aquí

Subprograma de entrevista de prueba de software

¡El banco de preguntas de pruebas de software superado por millones de personas! ! ! ¡Quién es quién lo sabe! ! ! El miniprograma de cuestionarios más completo de toda la red, puedes usar tu teléfono móvil para hacer los cuestionarios, en el metro o en el autobús, ¡enróllalo!

Se cubren las siguientes secciones de preguntas de la entrevista:

1. Teoría básica de pruebas de software, 2. web, aplicaciones, pruebas de función de interfaz, 3. red, 4. base de datos, 5. linux

6. web, aplicación, automatización de interfaz, 7. pruebas de rendimiento, 8. conceptos básicos de programación, 9. preguntas de la entrevista de horas, 10. preguntas de prueba abiertas, 11. pruebas de seguridad, 12. conceptos básicos de informática

Estos materiales deberían ser el almacén de preparación más completo y completo para los amigos [de pruebas de software]. Este almacén también ha acompañado a decenas de miles de ingenieros de pruebas en el viaje más difícil. ¡Espero que pueda ayudarlo a usted también! 

Supongo que te gusta

Origin blog.csdn.net/lzz718719/article/details/132669917
Recomendado
Clasificación