- 面试官想考察什么
- 全局观:你是否真的了解软件是怎么回事?你能否正确区分测试用例的优先顺序?
- 懂整合:你是否了解软件的工作原理?该如何将他们整合成更大的软件生态系统?
- 会组织:你能否有条理地处理问题?还是处理问题时毫无条理。将测试功能分类,分类测试。
- 可操作:你制定的测试计划是否合理,行之有效?
- 测试问题的分类以及解题步骤
- 测试现实生活中的事物
- 使用者是哪些人?做什么用?
【与面试官讨论,谁会使用这个产品,做什么用。】
- 有哪些用例
- 有哪些使用限制?功能上或环境上
- 压力与失效情况下的状态如何?
跟面试官探讨时,最好问一下什么情况下产品失效是可接受的(甚至是必要的),以及什么样才算是失效。 - 如何执行测试
- 测试一套软件
- 白盒测试与黑盒测试:两者的区别反应了我们队软件内部机制的掌握程度。
- 白盒测试:我们会了解程序的内部机制,还可以分别对每一个函数单独进行测试。
- 黑盒测试:我们只关心软件的表象,并且仅测试其功能
- 步骤
- 要做白盒还是黑盒测试?
- 使用者是哪些人?做什么用?
一般来说,软件会有一个或多个目标用户,设计各个功能,就会考虑用户需求。 - 有哪些用例?
切记,不可凭空想象来决定各种用例,应该与面试官交流讨论后确定。 - 有哪些使用限制?
大致定义好用例后,还需要找出确切的意思。 - 压力条件和失效条件为何?
软件失效应该是什么样的? - 有哪些测试用例?如何执行测试
- 编写代码测试一个函数
通常不外乎就是验证输入与输出。 - 定义测试用例【只有充分了解函数的功能,才能想到下面的测试用例】
- 正常情况
- 极端情况
- 空指针和“非法”输入
- 奇怪输入
- 定义预期结果:正确的输出
- 编写测试代码
- 调试与故障排除
- 理清状况
【多提问,尽量了解当时的情况】 - 分解问题
【了解问题发生时的具体状况,接着着手将问题分解为可测模块】 - 创建特定的,可控的测试
测试联系题
1. 找出以下代码的错误
unsigned int i; for (i = 100; i >= 0; --i) { printf("%d\n", i); } |
解答:
做这种题目,看一句写一句相关的限制条件。
unsigned int i; // unsigned int 类型的变量>=0 for (i = 100; i >= 0; --i) { // 无限循环 printf("%d\n", i); // 打印的是 unsigned int 变量,所以打印格式为%u } |
2.有个应用程序一运行就崩溃,现在你拿到了源码。你在调试器中运行了10次之后,你发现该应用每次崩溃的都不一样。这个应用只有一个线程,并且只调用c标准库函数。究竟是什么样的编程错误导致程序崩溃?如何逐一测试每种错误?
解答:具体如何处理这个问题要视待诊断应用程序的类型而定。导致随机崩溃的常见原因如下:
- 随机变量:该应用程序可能用到某个随机遍历或可变分量,程序每次执行时取值不定。比如,用户输入,程序生成的随机数或当前时间
- 未初始化变量:该应用程序可能包含一个未初始化变量。系统给它一个任意值,可能导致程序每次执行路径有所不同。
- 内存泄漏:该程序可能存在内存溢出。每次运行时引发问题的可疑进程随机不定,这与当时运行的进程数量有关。另外,还包括堆溢出或栈内数据被破坏。
- 外部依赖:该程序肯呢个依赖别的应用程序,机器或资源。要是存在多处依赖,程序就有可能在任意位置崩溃。
首先应该问问面试官,谁在运行这个程序?它的用途是啥?属于什么类型的应用?
3.有个国际象棋游戏程序使用了方法:boolean canMoveTo(int x, int y),其中x和y是棋盘的坐标,该函数返回棋子能否移动到那个位置。请说明你会如何测试该方法。
两大测试类型:极限情况测试(验证输入输出的有效性)和功能性测试(一般情况测试)
(1)极限情况测试
- 测试x和y为负数;
- 测试x大于棋盘的宽度;
- 测试y大于棋盘的长度;
- 测试一个满是棋子的棋盘;
- 测试一个空或接近空的棋盘;
- 测试白子远多于黑子的情况;
- 测试黑子远多于白子的情况。
对于上述错误的情况,应该询问面试官,是返回false还是抛出异常。
(2)一般情况测试
理想的做法是测试每一种可能的棋盘布局,但是棋局实在太多了。因此,我们的测试选取案例,应该尽量涵盖不同的棋局。国际象棋一共有6种棋子(王,后,车,马,象,兵),测试每一种棋子,在所有可能的方向上,向其他所有棋子移动的情况。测试算法如下:
对每一种棋子a: 对其他每一种棋子b 对每一个方向d 创建有a的棋盘布局 将b放在方向d上 试着移动,并检查返回值 |
4.不借助任何测试工具,该如何对网页进行负载测试?
解答:
- 性能衡量指标:
- 响应时间;
- 吞吐量
- 资源利用率
- 系统所能承受的最大负载
- 工具创建与数据收集分析
- 可以通过编写多线程的程序,新建成千上万个线程,每个线程扮演一个实际用户,构建上千万的虚拟用户,载入待测试页面。对每个用户,可以利用程序测量响应时间、数据I/O等。
- 分析测试期间收集的数据结果,并与可接受的值进行比较
5.如何测试一只笔?
解答:对于这种开放性问题,一定要与面试官沟通好,得到限制的条件。问面试官如下问题:
- 提问
- 谁
- 什么用途
- 何时何地使用
- 如何使用
- 总结一下了解的限制条件,然后跟面试官述说一下
- 测试计划
- 事实核查
- 预期用途
- 安全性
- 非预期用途
对于任何测试问题,你都必须测试预期和非预期的场景
6.在一个分布式银行系统中,该如何测试一台ATM机?
解答:
- 提问
- 谁会使用ATM机?
- 用ATM机来做啥?
- 有什么工具来测试?
- 可以查看源代码吗还是只能访问ATM机?
- 测试用例
- 登录
- 取款
- 存款
- 查询余额
- 转账
注意并发性带来的问题,比如同时在ATM机和网上存取款
- 总结:
- 确定自己要测试的是什么。
- 确定整个系统里那些事项是最重要的。是安全和可靠性还是快速响应
所有内容都是用BSD条款。 Copyright (C) by CloudFeng.