# Tpshop自动化测试项目 **Repository Path**: LaoluWork/tpshop-autotest ## Basic Information - **Project Name**: Tpshop自动化测试项目 - **Description**: 主体使用Selenium+PyTest+allure+PyMysql,部分使用Requests实现接口自动化 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 18 - **Forks**: 2 - **Created**: 2022-12-22 - **Last Updated**: 2025-09-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Tpshop自动化测试项目 ## 00、总体概述 ### 一、项目概述 #### 1、所使用到的技术栈 PyTest + Selenium + allure + Requests + PyMysql - 整个项目以PyTest为测试框架,使用allure来生成测试报告 - 主要:使用selenium实现ui自动化,通过PyMysql来与数据库通信(校验或者操作数据) - 部分:使用Requests库实现了登录和注册两个功能的接口自动化测试 - 项目使用PO模式的三层架构 - 对象层:用于定位元素 - 操作层:调用对象层,用于实现指定元素的操作,如输入信息,点击等 - 业务层:调用操作层,用于实现某些指定的功能,如登录,搜索,添加商品到购物车等 - 每个web页面的代码框架如下: ```python class xxxPage(BasePage): pass class xxxHandle(BaseHandle): pass class xxxService: pass ``` #### 2、项目模块及目录介绍 - api —— 存放接口自动化测试相关api的模块 - data —— 存放测试用例数据的目录 - api —— 接口自动化测试用例的数据 - ui —— ui自动化测试用例的数据 - log —— 存放日志的目录 - page —— 存放所有用到的web页面(包括BasePage,前台页面,后台页面) - back —— 用到的后台管理系统web页面 - base —— BasePage的存放位置 - front —— 用到的前台web页面 - report —— 存放allure产生的临时数据以及测试报告 - scripts —— 存放测试脚本的模块 - api —— 接口自动化的测试脚本 - ui —— ui自动化的测试脚本 - config.py —— 作为项目的配置文件(包括配置全局绝对路径,日志器配置,MySQL信息) - pytest.ini —— PyTest框架的配置文件 - utils.py —— 作为项目的工具类(包括webdriver的管理,读取数据方法,操作数据库的通用类,快速登录后台管理系统的方法) ### 二、运行项目与开发流程 #### 1、运行项目 > 前提:启动TPShop商城,包括前台购物商城和后台管理系统 - 打开cmd或Terminal,在项目的路径下,直接输入 **pytest** 后回车即可运行项目 - 脚本执行完之后,输入 **allure generate report/temp_data -o report/html --clean**来生成测试报告 - report/temp_data : 表示的是脚本执行过程中allure生成的数据的位置 - report/html :表示allure这次命令执行后生成的html存放位置 - allure的命令执行完后,就可以打开report/html目录下的index.html查看测试报告 #### 2、实现某个功能或业务的开发流程 - 编写实现某个功能或业务所要操作的web页面(里面包括PO模式的三层架构),如login_page.py - 编写对应功能的测试类,如test_login.py - 每种功能或业务一般都有正向和逆向的测试方法,如test_login_fail(), test_login_success() - 断言结果,出现错误或断言失败都记录到日志以及使用allure截下最后操作的图片 - 单独测试该功能或业务(单元测试),在暂时不需要测试的方法或类上添加@pytest.mark.skip()装饰器跳过测试,最后整合整个测试类一起来测试 ## 01、Selenium实现Web自动化 ### 一、已实现测试的功能模块 #### 1、登录模块 - 登录失败 (**断言**弹窗消息内容) - 用户名为空 - 密码为空 - 验证码为空 - 账号不存在 - 登录成功(**断言**登录成功跳转的mine我的页面,判断其显示的用户名) #### 2、注册模块 - 注册成功 - 先在商城页面注册用户 - 然后登录后台管理系统**断言**会员列表第一条是否是刚刚新增的用户数据 - 去数据库根据注册数据查询,**断言**数据是否已经插入成功 - 上面两个断言成功之后,就去数据库删除刚刚新增的这条数据,使得测试数据可重复执行 - 注册失败(因为该商城系统在这一功能上的实现不完善,bug明显,暂不测试) #### 3、搜索模块 - 搜索商品的成功与失败 - 成功与失败的测试数据中,会用case关键字来区分 - 第一次搜索直接在首页搜索,第二次及之后就直接在上一次的搜索页面上输入搜索 - 成功的案例中需要**断言**出现的商品是否包含搜索时输入的关键词 - 失败的案例中需要**断言**是否出现没有找到对应商品的提示语句 #### 4、购物车模块 - 添加商品成功 - **断言**单价、购买数量、小计这三个数值在商品详情页和购物车页是否相同 - **断言**购物车页多种商品的总计 #### 5、下单业务流程模块 - 下单失败 - 未登录的状态下(**断言**跳转的页面或弹窗) - 结算购物车里的商品 - 在某个商品详情页直接点击购买 - 已登录但未填写地址(**断言**是否弹出填写收货地址的选择框) - 结算购物车里的商品 - 在某个商品详情页直接点击购买 - 下单成功 - 用上面提到的两种方式进入到订单检查页面后,输入收货地址并保存,随后下单 - **断言**下单后是否显示订单提交成功等信息 - 然后去支付订单(必须选择货到付款,因为该商城系统还没完成其他第三方的支付方式) - **断言**支付后是否显示尽早给我们发货等信息,同时记录下订单号 - 删除保存的地址,维护测试用例的可重复执行性(使用pymysql去数据库删除) - 进入后台管理系统,打开到订单列表,获取最新的订单号 - **断言**最新的这个订单号是否与刚刚下单的订单号一致 ### 二、开发过程中常见问题 #### 1、元素需要强制等待(等待发送请求和服务器响应,因为该商城系统性能有限) - 登录失败时,会有弹窗消息,但是弹窗消息需要后端校验数据之后返回,所以需要使用强制等待再定位元素来获取弹窗的text内容 - 登录成功后,需要等待服务器返回页面资源 - 填写收获地址后点击保存也需要强制等待 - ..... #### 2、动态id难以定位 - 可以使用XPath的层级关系 - 使用XPath的扩展用法,因为这些动态id都会有一段固定的内容 - ```python //td[starts-with(@id, 'cart')] ``` - ```python //td[contains(@id, 'goods_price')] ``` #### 3、input输入框出现NaN > 在商品详情页中,商品数量的input输入框中有失去焦点的js事件,当对商品数量input元素进行先clear后send_keys输入时,会出现NaN值在输入框中,而不是想要输入的值。这是因为元素进行clear() 操作之后会失去焦点,js定义的函数中无法将空值转换为数字导致出现NaN字眼。 解决: ​ 使用send_keys()中的键盘操作,实现删除后输入 ```python element.send_keys(Keys.BACK_SPACE, count) # 这里的删除和输入属于一次性操作,中途不会触发失去焦点的校验 ``` ## 02、Requests实现接口自动化 ### 一、实现的测试功能 #### 1、登录校验模块 - 登录成功和登录失败返回的json数据结构是类似的,所以可以统一为一个方法来测试 #### 2、注册模块 - 注册失败(注册成功返回的是HTML页面,这里不实现接口自动化测试) - 校验返回的json数据中对应的msg是否正确