首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
Ubuntu环境使用TPC-DS工具生成测试数据
2
cookie机制及其原理
3
网络测试,带宽测试,流量测试
4
使Edge浏览器打开仅支持IE兼容模式的网站
5
【Linux】挂载硬盘、镜像文件、rpm软件包管理器、yum软件包管理器、软件安装jdk、tomcat、mysql
6
【Spring Boot 项目创建】002-代码关联 Git 远程仓库
7
用ChatGPT生成测试数据
8
手机APP测试(测试点、测试流程、功能测试)
9
web前端好帮手 - Jest单元测试工具
10
用ChatGPT生成测试数据
11
Redis 精简笔记
12
一句话就能提Bug,这个自动提交Bug Skill 太好用了
13
从0到1做出可复用的 iOS 自动化测试 Skill,附真机演示效果
14
大厂测开面试都在问AI,这个实战项目直接帮你准备好了
15
OpenClaw 拿什么吃掉测试岗?
16
一篇理清Prompt,Skill,MCP之间的区别
17
AI 测试必备:推荐一款能让自动化失败脚本「自己修好」的 AI skill!
18
【Selenium 自学系列】(一)看源码分析交互原理
19
什么是CI/CD
20
这到底是前端还是后端Bug
21
详解接口测试(2)- HTTP接口用例设计与测试方法(拿B站练手)
22
比羊了个羊还火的ChatGPT,玩法全攻略讲解
23
爱心代码文字升级版
24
自动打包、装机、生成用例、真机回归,AI 测试流水线终于跑通了
25
AI生成注册用户测试用例
26
AI驱动的测试报告分析:从数据中挖掘测试洞察
27
WEB功能测试说明
28
APP功能测试要点
29
不输ChatGPT,kimi秒画流程图
30
聊天功能如何测试?
31
订单支付功能测试
32
app功能测试--需要测试哪些要点
33
【软件测试】使用QTP进行功能测试
34
TestZeus Hercules:功能测试写 Gherkin,让 AI Agent 去跑冒烟流程
35
非功能需求的测试
36
【功能篇】如何测试报表?
37
VFP AI 插件(ver:20251007)测试报告
38
VFP AI 插件使用指南(三)
39
「 支付功能 」的测试思路
40
研发、测试提效攻略:利用Apipost AI 6 大核心功能实现接口测试全流程
41
功能测试之app测试要点提取与分析
42
网站测试中短信发送功能测试点
43
常用功能的测试用例
44
20行代码,用Python实现异常测试用例
45
新梦想干货——软件测试中的43个功能测试点(下)
46
《打造你的 AI 知识库:用 Skill 实现项目文档的自动生成与维护》
47
Apifox和Apipost:2025 API工具巅峰对决
48
接口测试--apipost接口断言详解
49
ApiPost自动化测试基础之:如何使用测试校验(测试用例)?
50
教你用 Node.js 模拟自动发送邮件验证码
清单首页测试文章详情

20行代码,用Python实现异常测试用例

接上篇文章~

一、注意

做大型项目的时候,用例是非常多的,所以.py文件的名字一定要根据模块来命名,否则就分不清了。

根据功能的复杂与简单,来决定要不要分成2个页面,例如1个页面只是个显示的功能,没有别的东西了,那就没有必要浪费时间再去整一个。如果初学者分不清,就按着自己的看法来。

一个测试用例=多个页面的多个功能串起来

调用多个页面类=同一个浏览器会话上面,串行执行完成的

用例中没必要一定要写个assert,它就是个非常明显的断言。

实际上,我们可以用其它的方式来代替它。

PO模式的目的就是把页面的元素定位和元素操作跟测试用例分开。

分离彻底的目的就是各自维护各自的,各不相干。不至于元素定位一发生变化,就在测试用例中到处去找。

例如这种错误的方式:

代码语言:javascript
代码运行次数:0
复制
 def test_login_success(self):
        #步骤  输入用户名:XXx 密码XXX 点击登陆
        self.lg.login('18684720553','python')
        #断言  首页当中-能否找到  退出  这个元素
        #等待10秒 元素有没有出现 //a[@href="/Index/logout.html"]
        WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[@href="/Index/logout.html"]')))

有些用例中的断言肯定是不止一条的,可能涉及的元素定位有1个以上。每一个测试用例都有元素的断言,也就意味着每条用例中都可能有元素定位方式。

如果某一个元素的定位方式发生变化,你能保证200个定位中没有重复的这种元素定位吗?

能保证某一个元素发生了变化,测试用例不需要同步修改吗?

所以这种做法是不可取的,后期维护的时候工作量非常的大。

做项目,写框架要看整体项目层面的,不能现在写的爽,以后苦。

从登陆页跳转过来,没有那么快出现,所以加上10秒时间缓冲。

步骤是一样的,断言的方式都是一样的,只是参数不一样而已,那你就可以用ddt。

二、代码

来自文件index_page.py

代码语言:javascript
代码运行次数:0
复制
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class IndexPage:

    def __init__(self,driver):
        self.driver=driver

    def isExist_logout_ele(self):
        # 等待10秒 元素有没有出现 //a[@href="/Index/logout.html"]
        #如果存在就返回True,不存在就返回False
        try:
            WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//a[@href="/Index/logout.html"]')))
            return True
        except:
            return False

来自文件login_page.py

代码语言:javascript
代码运行次数:0
复制

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


class LoginPage:

    def __init__(self,driver):
        self.driver=driver

    #登陆
    def login(self,username,passwd,remember_user=True):
        #输入用户名
        #输入密码
        #点击登陆
        name_text='//input[@name="phone"]'
        pwd_text='//input[@name="password"]'
        login_but='//button[text()="登录"]'
        WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,name_text)))
        self.driver.find_element_by_xpath(name_text).send_keys(username)
        self.driver.find_element_by_xpath(pwd_text).send_keys(passwd)
       #判断一下rember_user的值,来决定是否勾选
        self.driver.find_element_by_xpath(login_but).click()

    #注册
    def register_enter(self):
        WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,"")))
        self.driver.find_element_by_xpath("").click()

    #获取错误提示信息-登录区域
    def get_errorMsg_from_loginArea(self):
        WebDriverWait(self.driver,20).until(EC.visibility_of_all_elements_located((By.XPATH,'//div[@class="form-error-info"]')))
        return self.driver.find_element_by_xpath('//div[@class="form-error-info"]').text

    #忘记密码

来自文件test_login.py

代码语言:javascript
代码运行次数:0
复制
import  unittest
from selenium import webdriver
from PageObjects.login_page import LoginPage
from PageObjects.index_page import IndexPage
from TestDatas import Common_Datas as CD
from TestDatas import login_datas as LD
import ddt

@ddt.ddt

class TestLogin(unittest.TestCase):
    # def setUpClass(cls):
    #     #通过excel读取本功能当中需要的所有测试数据
    #     pass

    def setUp(self):
        # 前置  访问登陆页面
        self.driver=webdriver.Chrome()
        self.driver.get(CD.web_login_url)
        self.lg=LoginPage(self.driver)

    def tearDown(self):
        #后置
        self.driver.quit()

    # 正常用例-登陆成功
    def test_login_success(self):
        #步骤  输入用户名:XXx 密码XXX 点击登陆
        self.lg.login(LD.success_data["user"],LD.success_data["passwd"])
        #断言  首页当中-能否找到  退出  这个元素
        self.assertTrue(IndexPage(self.driver).isExist_logout_ele())



    #
    #异常用例 -手机号格式不正确(大于11位、小于11位、为空、不在号码段)  ddt\
    @ddt.data(*LD.phone_data)
    def test_login_user_wrongFormat(self,data):
        # 步骤  输入用户名:XXx 密码XXX 点击登陆
        self.lg.login(data["user"],data["passwd"])
        # 断言  登陆页面 提示:请输入正确的手机号
        #登录页面中 -获取提示框的文本内容
        #比对文本内容与期望的值是否相等
        self.assertEqual(self.lg.get_errorMsg_from_loginArea(),data["check"])

    # def test_login_wrongData
    # #异常用例 - 用户名为空
    # def test_login_noUser(self):
    #     self.lg.login('', 'python')
    # # 步骤  输入用户名:XXx 密码XXX 点击登陆
    # # 断言  登陆页面 提示:请输入手机号
    #     pass

#异常用例-未注册手机号
#异常用例-错误的密码
#异常用例-不输入密码

来自文件Common_Datas.py

代码语言:javascript
代码运行次数:0
复制
#全局-系统访问地址-登录链接
web_login_url="http://120.78.128.25:8765/Index/login.html"

来自文件login_datas.py

代码语言:javascript
代码运行次数:0
复制
#正常场景-测试数据
success_data={"user":"18684720553","passwd":"python"}

#异常用例-手机号格式不正确(大于11位、小于11位、为空、不在号码段)
phone_data=[
{"user":"18684720","passwd":"python","check":"请输入正确的手机号"},
{"user":"18684720553123","passwd":"python","check":"请输入正确的手机号"},
{"user":"","passwd":"python","check":"请输入手机号"},
{"user":"11684720553","passwd":"python","check":"请输入正确的手机号"}
]

#异常用例

# layui-layer-content 此账号没有经过授权,请联系管理员! //div[@class="layui-layer-content"]

文件结构目录如图:

三、问题整理

1.像这样的测试用例,运行一次是不够的,在实际工作过程中调试这样的用例,连续运行3-5次不会出错,都是在我的预期当中,那就ok,暂时可以放下去写别的测试用例了。

如果运行3-5次运行不成功,那就先把它调试成功,再去做其它的测试用例。

要求稳定性。 这种用例需要在很多地方都要调试的。不同的电脑运行起来的效果不同,可能本机是成功的,但是放到别的电脑上就挂了。这是Web自动化比较常见的现象。

考验系统的稳定性,有时候系统的性能不好、网速比较慢或者系统有bug等等,很多环境因素会影响结果。所以要想办法提升自己代码的健壮性。

所以元素之前该写等待的地方还是要等。主要提高自己代码的稳定性。

测试用例=测试对象调用+测试数据

2.同一套代码在Mac和Windows上运行有差异吗?

跨平台,如果都是谷歌浏览器,本质上都是一样的,但是电脑的环境不一样可能会导致某些地方运行失败。大部分东西都是一样的,不需要去改,只要先去运行一下,有没有失败的,失败的原因是什么,分析下原因就行了。

跨平台:Linux、Mac、Windows都支持。驱动程序换下就好了,其它都一样。

3.怎么定位界面这个3秒就闪过的提示呢?

实在搞不定,就去抱开发哥哥大腿,哈哈。

未完待续~


下一篇
举报
领券