免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

软件测试入门:运算符与数据类型如何影响断言结果

软件测试入门:运算符与数据类型如何影响断言结果 软件测试入门学的第二课通常就是运算符和数据类型。很多人觉得这是纯编程课和测试关系不大真到写用例、做断言、处理接口返回值的时候才发现类型不对、运算符用错才是最常见的失败原因。这套“软件测试入门到精通”教程把第二课放在运算符与数据类型进阶其实是在给后面的测试基础、项目实战做铺垫。这篇文章会把这一课里最值得掌握的东西拆开讲为什么测试人员要懂数据类型、运算符怎么影响断言结果、写自动化脚本时哪些类型坑最容易踩。适合零基础转行测试、刚写完入门脚本想往项目实战走的人。我最想强调的一点是测试里学运算符和数据类型不是要你成为语言专家而是要你能准确判断“程序算出来的结果对不对”。1. 测试入门为什么先啃运算符和数据类型1.1 测试用例设计里到处是判断逻辑写测试用例时等价类、边界值、判定表看起来是测试理论其实核心都在做同一件事给定一个输入判断输出是否符合预期。这个“判断”落到代码里就是比较运算符、逻辑运算符和条件分支。你不理解和的区别边界值就会写错。举个例子。需求是“年龄字段要求 18 岁以上可以注册”用例设计时至少要覆盖 17、18、19 三个值。如果用age 1818 是合法值如果用age 1818 就变成非法值。一个小小的运算符差别可能导致线上把一批刚好 18 岁的用户挡在门外。再比如优惠活动“满 100 减 10”。测试同学要确认金额为 99.99、100.00、100.01 时分别怎么处理。这里除了比较运算符还涉及小数精度和比较顺序。用浮点数直接比较amount 100可能因为精度问题出现意外结果。所以第二课不是在讲枯燥语法而是在解决你在测试用例里一定会遇到的判断问题。1.2 自动化断言、接口校验、数据准备都依赖类型自动化测试的核心是断言。断言本质是等值比较、范围判断、布尔结果判断。如果接口返回一个字符串类型的100你要判断金额是否大于 50直接拿字符串和整数比较要么报错要么结果完全不对。数据准备阶段也一样。构造测试数据时数据在代码里用什么类型存放直接决定后续怎么运算手机号不建议用整数存超过一定长度会丢失精度更适合字符串。金额建议用 Decimal 类型或字符串用浮点数容易有精度误差。标志位是True/False、0/1还是null直接影响断言写法。所以在测试基础阶段运算符和数据类型不是孤立知识点而是连接“业务规则”和“代码结果”的桥梁。项目实战里的接口测试、UI 自动化、数据库校验最后都会回到类型和运算上。2. 数据类型先过一遍基本类型、复合类型与强制转换2.1 先分清基本类型和复合类型不同语言的类型清单不一样但底层概念是共通的。Python 里常见的是int、float、str、bool、NoneType以及list、tuple、dict、set。Java 里常见的是byte、short、int、long、float、double、char、boolean以及String、数组和各种对象。很多人会纠结“Java 八大基本数据类型”“Codesys 里的 UXINT 是什么”这类问题。其实这些都是在问同一个东西这个类型占多大空间、能存什么范围、怎么转换。作为测试入门不需要把每种语言的所有类型都背下来先掌握通用概念再熟悉自己脚本所在语言的细节。场景Python 常见类型Java 常见类型整数intint、long、short、byte小数floatfloat、double文本strString、char布尔boolboolean空值Nonenull集合list、tuple、dict、set数组、List、Map、Set这里给的是通用情况实际语法以你使用的语言版本为准。学习时不要只记“有哪些类型”要记“这个类型能接受什么值不能接受什么值”。2.2 类型转换为什么是测试里的重灾区接口返回的数据经常是字符串数据库字段可能是整数、小数、日期。测试脚本里要进行比较就需要统一类型。常见的转换写法int(123) # 字符串转整数 float(3.14) # 字符串转小数 str(123) # 数字转字符串 bool() # 空字符串转布尔结果是 FalseJava 里则是Integer.parseInt(123); Double.parseDouble(3.14); String.valueOf(123);转换并不是总能成功。字符串里带空格、千分位、货币符号直接转换会报错。float(abc)会抛异常。str(None)会变成字符串None可能掩盖空值问题。我在写测试脚本时只要发现断言结果异常第一件事就是打印参与比较的变量类型。很多时候问题不是逻辑写错而是接口返回的字段类型和预期不一致。2.3 不同语言默认值不同容易导致误判Java 的基本类型有默认值int默认是 0boolean默认是 false对象类型默认是 null。Python 变量必须先赋值再使用没有“默认值”的说法。这个差异在测试脚本里很容易踩坑。比如从数据源读取一个配置项Java 里可能返回 null你拿着 null 去做比较就会有空指针异常。Python 里可能是NoneNone 60这种写法会直接报错。所以处理外部输入时先判空再做运算是一个很实用的习惯。第二课里学的类型和空值处理到了项目实战阶段会反复用到。3. 运算符不是背公式短路、优先级和边界条件才是关键3.1 六类运算符一句话理解算术运算符 - * / % // **赋值运算符 - * /比较运算符 ! 逻辑运算符Python 是and or notJava 是 || !成员运算符in not in判断元素是否在集合里身份运算符is is not判断是否是同一个对象日常测试脚本里比较运算符和逻辑运算符用得最多。算术运算符在计算预期结果时也会用比如验证订单金额、折扣、积分。3.2 优先级不是靠背靠加括号完整优先级表很难记我也记不住。但有一条经验很实用写测试断言时凡是混了多个运算符直接加括号。if (score 60) and (not is_disabled): result pass加括号不丢人。它有两个好处第一自己不会因为优先级判断错误写错逻辑第二别人看代码时不用猜你的意图。很多线上误判不是业务规则错而是多个and、or混在一起又没有括号导致整体判断和预期不一致。测试同学自己写断言时尤其要养成“该加括号就加括号”的习惯。3.3 短路逻辑与空值保护Python 的and、or是短路的Java 的、||也会短路。意思是左边表达式已经能确定结果时右边不会执行。这个特性最常用的场景是空值保护if user is not None and user[age] 18: ...如果反过来写if user[age] 18 and user is not None: ...当user是None时左边先访问了键直接抛异常。短路逻辑用得对可以避免很多空值问题用不对反而会制造问题。3.4 取余、整除、自增自减的测试陷阱7 / 2在 Python 3 里是 3.57 // 2是 3。Java 里两个整数相除结果是整数7 / 2是 3。第一次写脚本的人很容易在除法上翻车。10 % 3的结果是 1。取余运算常用于判断奇偶、循环边界、周期性任务。测试用例里验证“每隔 3 次执行一次”这类规则时就会用到。自增自减在 Java 里是i、i--Python 没有这种写法。跨语言写测试脚本时先确认当前语言的语法不要照搬。4. 把第二课落进测试场景断言、参数化与接口校验4.1 断言比较运算符和逻辑运算符怎么组合接口测试里最常见的一段断言长这样resp {status_code: 200, body: {success: True, token: abc123}} assert resp[status_code] 200 assert resp[body][success] is True assert resp[body].get(token) is not None这里的几个细节比较值是否相等。is判断布尔值和None比更严格。.get()拿不到键时返回None不会抛KeyError。如果接口返回的success是字符串true那is True就会失败。这时要先确认接口真实返回类型再决定怎么断言。4.2 参数化输入数据用什么类型组织参数化是测试里最常用的数据驱动方式。把一组输入和预期结果放到同一个结构里跑循环断言cases [ {name: 满分, score: 100, expected: 优秀}, {name: 边界90, score: 90, expected: 优秀}, {name: 接近良好, score: 89, expected: 良好}, ]用字典组织有个好处每条用例都有名字断言失败时能直接看到是哪条数据出了问题。用列表套元组也可以但可读性差一些。参数化阶段最容易犯的错是用例里手动填错了类型。比如score写成字符串100后续所有断言都受影响。所以数据准备要统一尽量在用例生成后就明确类型。4.3 接口测试和数据库校验的类型处理接口返回的 JSON 里字段类型不一定和文档一致。常见情况文档写的是 int实际返回字符串100。金额返回100.00需要统一成小数再比较。布尔值返回true但某些系统里可能是1或true。数据库校验也一样。MySQL 的DECIMAL字段在不同驱动下可能被读成字符串或Decimal对象。断言前先确认类型再用合适的转换score resp[data][score] assert float(score) 60如果只写assert score 60字符串和整数比较会报错。这类问题不是功能 bug但会挡住测试脚本的执行。5. 执行脚本时最常见的类型与运算符坑5.1 现象报错、误判、空值异常常见的报错包括TypeError: not supported between instances of str and intValueError: could not convert string to floatJava 里的NullPointerException断言没有报错但结果明显不对属于漏判这些现象看着不一样根源往往一样类型不匹配、运算符用错、空值没处理。5.2 排查顺序遇到执行脚本失败不要急着改代码按顺序来先看日志和报错信息确定是哪一行出了问题。打印或检查参与比较的变量值和类型。确认运算符是否用对是还是是and还是or是否少了括号。检查是否做了类型转换转换的目标类型是否合理。最后检查依赖版本、数据源、环境配置。这个顺序能覆盖大多数问题。很多人一上来就怀疑测试逻辑结果只是接口返回的字符串没转整数。5.3 一个典型失败案例分析假设要判断接口返回的score是否大于等于 60resp {data: {score: 75}} score resp[data][score] if score 60: print(通过)这段代码在 Python 3 中会报错因为字符串和整数不能直接比较。修复方式score float(resp[data][score]) if score 60: print(通过)再进一步如果score字段可能不存在要先用.get()或先判空。真实项目里比这个复杂但排查思路是一样的输入类型、运算符、空值三条链路走一遍能解决大部分问题。6. 一个最小演练从需求到可运行断言脚本6.1 需求与用例设计做一个“成绩等级判断”的小例子输入分数和“是否老年学员”输出等级大于等于 90 且老年学员优秀大于等于 80 且老年学员良好大于等于 80合格大于等于 60及格小于 60不及格根据这个规则设计用例用例名分数是否老年预期优秀边界90True优秀良好边界80True良好合格边界80False合格及格边界60False及格不及格59.9False不及格这里故意覆盖了分数边界和布尔判断两种场景。6.2 数据准备与类型选择分数用float因为可能带小数是否老年用bool。这样能减少类型转换带来的干扰。cases [ (优秀边界, 90.0, True, 优秀), (良好边界, 80.0, True, 良好), (合格边界, 80.0, False, 合格), (及格边界, 60.0, False, 及格), (不及格, 59.9, False, 不及格), ]6.3 脚本实现与运行验证def grade(score: float, is_senior: bool) - str: if score 90 and is_senior: return 优秀 if score 80 and is_senior: return 良好 if score 80: return 合格 if score 60: return 及格 return 不及格 def run_case(name, score, is_senior, expected): actual grade(score, is_senior) if actual ! expected: print(f[失败] {name}: 预期 {expected}, 实际 {actual}) else: print(f[通过] {name}) for case in cases: run_case(*case)这个例子很小但已经具备参数化、断言、日志输出的雏形。全部跑完后应该看到五条用例都通过。如果某条失败先看是预期数据写错还是grade函数里的判断逻辑有问题。6.4 运行结果怎么看确认三件事边界值 90、80、60 是否覆盖。布尔值True和False是否分别走进不同分支。失败日志能不能直接定位到具体用例。如果只是为了练习不必追求复杂框架。这个小脚本能跑通再迁移到接口自动化里替换成真实的接口返回和断言条件。7. 第二课学完怎么衔接后面的项目实战7.1 先做语法到业务逻辑的映射学完运算符和数据类型后不要只刷语法题。找一个真实业务规则转换成表达式。比如“注册页密码至少 8 位且不能包含空格”password abc12345 if len(password) 8 and not in password: print(通过)这种练习做得越多后面看接口自动化代码就越轻松。7.2 建立三类习惯写脚本前先写用例哪怕只有三五行也要想清楚输入、预期、边界。调试时先打印类型print(type(score))比靠猜快很多。保存失败现场记录输入数据、预期结果、实际结果和日志长期排查时会很有用。这些习惯看着简单但能避免大量重复定位时间。7.3 项目实战不要一开始就追求完整框架很多教程会拿前后端分离项目、停车场管理系统、接口管理平台当实战题目。这类项目能帮你理解真实数据流但入门阶段先跑通接口测试和数据库校验更实际。别急着上高并发、分布式、复杂框架。先把“单个接口返回的数据是否正确”验证稳定再谈批量回归。如果项目实战里遇到设备回调、识别结果、状态字段这类数据本质上还是类型和运算符的问题。比如设备返回的识别结果可能是字符串也可能是数字甚至可能是空值。处理方式都是先确认类型再做断言。第二课的基础打牢了这些场景才能真正落地。我个人的建议是第二课学完之后不要急着往下刷教程。先把数据类型和运算符在本地脚本里各跑三组用例尤其要跑边界值和空值。等到你写断言时不再问“为什么字符串和整数不能比较”就可以往后走测试基础了。很多问题不是工具能力不够而是输入类型和运算符没有处理干净。
返回列表