zoukankan      html  css  js  c++  java
  • Cracking the Coding Interview 之测试

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

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

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

    测试联系题

    1. 找出以下代码的错误

    unsigned int i;                                        

    for (i = 100; i >= 0; --i) {                

    printf("%d ", i);                                

    }

    解答:

    做这种题目,看一句写一句相关的限制条件。

    unsigned int i;                            // unsigned int 类型的变量>=0

    for (i = 100; i >= 0; --i) {                // 无限循环

    printf("%d ", 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机和网上存取款

    • 总结: 
      • 确定自己要测试的是什么。
      • 确定整个系统里那些事项是最重要的。是安全和可靠性还是快速响应
  • 相关阅读:
    integration computation in R,computing the accumulation,derivatives,partial derivatives of various higher order function
    some transcripts quantification brief comprehensions
    易混淆的统计概念
    Robust detection of alternative splicing in a population of single cells
    窗口随鼠标移动
    jquery的fade方法实现淡入淡出
    jquery动画效果的隐藏和显示
    jquery滑进滑出效果
    jquery通过extend关键字自定义方法
    jquery的clon
  • 原文地址:https://www.cnblogs.com/cloudfeng/p/4916717.html
Copyright © 2011-2022 走看看