云枫的菜园子

带着一个流浪的心,慢慢沉淀。 https://github.com/CloudFeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1. 面试官想考察什么 
    • 全局观:你是否真的了解软件是怎么回事?你能否正确区分测试用例的优先顺序?
    • 懂整合:你是否了解软件的工作原理?该如何将他们整合成更大的软件生态系统?
    • 会组织:你能否有条理地处理问题?还是处理问题时毫无条理。将测试功能分类,分类测试。
    • 可操作:你制定的测试计划是否合理,行之有效?
  2. 测试问题的分类以及解题步骤 
    • 测试现实生活中的事物 
      • 使用者是哪些人?做什么用?

   【与面试官讨论,谁会使用这个产品,做什么用。】

  • 有哪些用例
  • 有哪些使用限制?功能上或环境上
  • 压力与失效情况下的状态如何? 
    跟面试官探讨时,最好问一下什么情况下产品失效是可接受的(甚至是必要的),以及什么样才算是失效。
  • 如何执行测试
  • 测试一套软件 
    • 白盒测试与黑盒测试:两者的区别反应了我们队软件内部机制的掌握程度。 
      • 白盒测试:我们会了解程序的内部机制,还可以分别对每一个函数单独进行测试。
      • 黑盒测试:我们只关心软件的表象,并且仅测试其功能
    • 步骤
    • 要做白盒还是黑盒测试?
    • 使用者是哪些人?做什么用? 
      一般来说,软件会有一个或多个目标用户,设计各个功能,就会考虑用户需求。
    • 有哪些用例? 
      切记,不可凭空想象来决定各种用例,应该与面试官交流讨论后确定。
    • 有哪些使用限制? 
      大致定义好用例后,还需要找出确切的意思。
    • 压力条件和失效条件为何? 
      软件失效应该是什么样的?
    • 有哪些测试用例?如何执行测试
  • 编写代码测试一个函数 
    通常不外乎就是验证输入与输出。 
    • 定义测试用例【只有充分了解函数的功能,才能想到下面的测试用例】 
      • 正常情况
      • 极端情况
      • 空指针和“非法”输入
      • 奇怪输入
    • 定义预期结果:正确的输出
    • 编写测试代码
  • 调试与故障排除 
    • 理清状况 
      【多提问,尽量了解当时的情况】
    • 分解问题 
      【了解问题发生时的具体状况,接着着手将问题分解为可测模块】
    • 创建特定的,可控的测试

 

测试联系题

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),其中xy是棋盘的坐标,该函数返回棋子能否移动到那个位置。请说明你会如何测试该方法。

两大测试类型:极限情况测试(验证输入输出的有效性)和功能性测试(一般情况测试)

1)极限情况测试

  1. 测试xy为负数;
  2. 测试x大于棋盘的宽度;
  3. 测试y大于棋盘的长度;
  4. 测试一个满是棋子的棋盘;
  5. 测试一个空或接近空的棋盘;
  6. 测试白子远多于黑子的情况;
  7. 测试黑子远多于白子的情况。

对于上述错误的情况,应该询问面试官,是返回false还是抛出异常。

2)一般情况测试

理想的做法是测试每一种可能的棋盘布局,但是棋局实在太多了。因此,我们的测试选取案例,应该尽量涵盖不同的棋局。国际象棋一共有6种棋子(王,后,车,马,象,兵),测试每一种棋子,在所有可能的方向上,向其他所有棋子移动的情况。测试算法如下:

对每一种棋子a:

   对其他每一种棋子b

     对每一个方向d

        创建有a的棋盘布局

        将b放在方向d上

        试着移动,并检查返回值

 

4.不借助任何测试工具,该如何对网页进行负载测试?

解答:

  • 性能衡量指标: 
    • 响应时间;
    • 吞吐量
    • 资源利用率
    • 系统所能承受的最大负载
  • 工具创建与数据收集分析 
    • 可以通过编写多线程的程序,新建成千上万个线程,每个线程扮演一个实际用户,构建上千万的虚拟用户,载入待测试页面。对每个用户,可以利用程序测量响应时间、数据I/O等。
    • 分析测试期间收集的数据结果,并与可接受的值进行比较

 

5.如何测试一只笔?

解答:对于这种开放性问题,一定要与面试官沟通好,得到限制的条件。问面试官如下问题:

  • 提问 
    • 什么用途
    • 何时何地使用
    • 如何使用
  • 总结一下了解的限制条件,然后跟面试官述说一下
  • 测试计划 
    • 事实核查
    • 预期用途
    • 安全性
    • 非预期用途 
      对于任何测试问题,你都必须测试预期和非预期的场景

 

6.在一个分布式银行系统中,该如何测试一台ATM机?

解答:

  • 提问 
    • 谁会使用ATM机?
    • 用ATM机来做啥?
    • 有什么工具来测试?
    • 可以查看源代码吗还是只能访问ATM机?
  • 测试用例 
    • 登录
    • 取款
    • 存款
    • 查询余额
    • 转账 

注意并发性带来的问题,比如同时在ATM机和网上存取款

  • 总结: 
    • 确定自己要测试的是什么。
    • 确定整个系统里那些事项是最重要的。是安全和可靠性还是快速响应
posted on 2015-10-28 11:12  CloudFeng  阅读(278)  评论(0编辑  收藏  举报