目录

你真的懂测试吗?从“用户登录”测试谈起

是什么

  1. 输入已注册的用户名和正确的密码,验证是否登录成功;
  2. 输入已注册的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;
  3. 输入未注册的用户名和任意密码,验证是否登录失败,并且提示信息正确;
  4. 用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;
  5. 用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;
  6. 如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入正确的验证码,验证是否登录成功;
  7. 如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入错误的验证码,验证是否登录失败,并且提示信息正确。

还需要增加:

  1. 用户名和密码是否大小写敏感;
  2. 页面上的密码框是否加密显示;
  3. 后台系统创建的用户第一次登录成功时,是否提示修改密码;
  4. 忘记用户名和忘记密码的功能是否可用;
  5. 前端页面是否根据设计要求限制用户名和密码长度;
  6. 如果登录功能需要验证码,点击验证码图片是否可以更换验证码,更换后的验证码是否可用;
  7. 刷新页面是否会刷新验证码;
  8. 如果验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;
  9. 用户登录成功但是会话超时后,继续操作是否会重定向到用户登录界面;
  10. 不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否正确;
  11. 页面默认焦点是否定位在用户名的输入框中;
  12. 快捷键 Tab 和 Enter 等,是否可以正常使用。

安全还需要包括:

  1. 用户密码后台存储是否加密;
  2. 用户密码在网络传输过程中是否加密;
  3. 密码是否具有有效期,密码有效期到期后,是否提示需要修改密码;
  4. 不登录的情况下,在浏览器中直接输入登录后的 URL 地址,验证是否会重新定向到用户登录界面;
  5. 密码输入框是否不支持复制和粘贴;
  6. 密码输入框内输入的密码是否都可以在页面源码模式下被查看;
  7. 用户名和密码的输入框中分别输入典型的“SQL 注入攻击”字符串,验证系统的返回页面;
  8. 用户名和密码的输入框中分别输入典型的“XSS 跨站脚本攻击”字符串,验证系统行为是否被篡改;
  9. 连续多次登录失败情况下,系统是否会阻止后续的尝试以应对暴力破解;
  10. 同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期;
  11. 同一用户先后在多台终端的浏览器上登录,验证登录是否具有互斥性。

性能压力测试用例包括:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  1. 单用户登录的响应时间是否小于 3 秒;
  2. 单用户登录时,后台请求数量是否过多;
  3. 高并发场景下用户登录的响应时间是否小于 5 秒;
  4. 高并发场景下服务端的监控指标是否符合预期;
  5. 高集合点并发场景下,是否存在资源死锁和不合理的资源等待;
  6. 长时间大量用户连续登录和登出,服务器端是否存在内存泄漏。

兼容性测试用例还需要包括:

  1. 不同浏览器下,验证登录页面的显示以及功能正确性;

  2. 相同浏览器的不同版本下,验证登录页面的显示以及功能正确性;

  3. 不同移动设备终端的不同浏览器下,验证登录页面的显示以及功能正确性;

  4. 不同分辨率的界面下,验证登录页面的显示以及功能正确性。

    总之:测试是测试不完的:要兼顾缺陷风险和研发成本之间的平衡

单元测试

是什么

单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。

为什么

  1. 单元测试属于最严格的软件测试手段,是最接近代码底层实现的验证手段,可以在软件开发的早期以最小的成本保证局部代码的质量。
  2. 单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益
  3. 单元测试的实施过程还可以帮助开发工程师改善代码的设计与实现,并能在单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用,这些调用方法构成了函数的使用说明。

怎么做

  1. 并不是所有的代码都要进行单元测试,通常只有底层模块或者核心模块的测试中才会采用单元测试。
  2. 你需要确定单元测试框架的选型,这和开发语言直接相关。比如,Java 最常用的单元测试框架是 Junit 和 TestNG;C/C++ 最常用的单元测试框架是 CppTest 和 Parasoft C/C++test;框架选型完成后,你还需要对桩代码框架和 Mock 代码框架选型,选型的主要依据是开发所采用的具体技术栈。
    通常,单元测试框架、桩代码 /Mock 代码的选型工作由开发架构师和测试架构师共同决定。
  3. 为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具。不同的语言会有不同的代码覆盖率统计工具,比如 Java 的 JaCoCo,JavaScript 的 Istanbul。在后续的文章中,我还会详细为你介绍代码覆盖率的内容。
  4. 最后你需要把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受。

相关概念

驱动代码,桩代码和 Mock 代码

是单元测试中最常出现的三个名词。

驱动代码是用来调用被测函数的,

桩代码和 Mock 代码是用来代替被测函数调用的真实代码的。

 软件测试 随笔
驱动代码,桩代码和 Mock 代码三者的逻辑关系

驱动代码(Driver)指调用被测函数的代码,在单元测试过程中,驱动模块通常包括调用被测函数前的数据准备、调用被测函数以及验证相关结果三个步骤。驱动代码的结构,通常由单元测试的框架决定。

桩代码(Stub)是用来代替真实代码的临时代码。 比如,某个函数 A 的内部实现中调用了一个尚未实现的函数 B,为了对函数 A 的逻辑进行测试,那么就需要模拟一个函数 B,这个模拟的函数 B 的实现就是所谓的桩代码。

总结

  1. 代码要做到功能逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确;
  2. 单元测试是对软件中的最小可测试单元在与软件其他部分相隔离的情况下进行的代码级测试;
  3. 桩代码起到了隔离和补齐的作用,使被测代码能够独立编译、链接,并运行。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄