程序员面试修炼09 | 网易2016内推笔试题

当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

——Steve McConnell 《代码大全》


名词解释

1、UT:(Unit Testing,单元测试),单元测试的对象是LLD中所划分定义的程序单元或模块,它也是单元测试用例设计中可测试的最大单元。该测试对象可能由一个或多个函数或者类组成,测试设计就是对测试对象进行测试用例设计。

2、IT:(Integration Testing,集成测试),集成测试是指把若干个经过单元测试的单元组装到一起而进行的测试,集成测试应依据HLD,主要发现接口、依赖中的错误或不完善的地方。集成测试的对象为若干个单元测试对象的组合,至少为两个。

3、ST:(System Testing,系统测试),系统测试是针对软件项目组所承担开发的软件系统进行的整体测试,将软件系统作为整体运行或实施明确定义的软件行为子集的测试。主要采用的测试方法是黑盒测试,即不管程序内部的实现逻辑,以检验输入输出信息是否符合规格说明书中有关需求规定的测试方法。可见ST的测试对象是规格说明书,更确切的说,是模块需求规格说明书,所以一般也称为MST。模块SRS文档给出了模块的输入输出的相应要求。MST后,每个模块是牢固可用的。

image

笔试/面试真题真题

题目描述(网易-2016内推笔试题)

有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?

输入描述:

每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:

输出一行表示最大的乘积。

输入例子:

3
7 4 7
2 50

输出例子:

49

解题思路:

dp。由于本题求的是乘积最大,而且数据存在负数,那么就需要存储最大值以及最小值。dp[i][j] 表示选第 i 个学生作为第 j 个备选人,mins存最小值,maxs存最大值。

代码示例:

#include   
#include   
#include   
#include   
using namespace std;  
const int maxn = 50 + 5;  
const long long minn = -1e17;  
struct DP {  
    long long mins;  
    long long maxs;  
}dp[maxn][15];  
int n;  
int a[maxn];  
int k, d;  
void input() {  
    for(int i = 1; i <= n; ++i) {  
        scanf("%d", &a[i]);  
    }  
    scanf("%d%d", &k, &d);  
}  
void solve() {  
    memset(dp, 0, sizeof(dp));  
    for(int i = 1; i <= n; ++i) dp[i][1].mins = dp[i][1].maxs = a[i];  
    long long ans = minn;  
    for(int i = 1; i <= n; ++i) {  
        for(int ki = 2; ki <= k; ++ki) {  
            int j = i - d;  
            if(j <= 0) j = 1;  
            for(; j < i; ++j) {  
                dp[i][ki].mins = min(dp[i][ki].mins, min(dp[j][ki - 1].mins * a[i], dp[j][ki - 1].maxs * a[i]));  
                dp[i][ki].maxs = max(dp[i][ki].maxs, max(dp[j][ki - 1].mins * a[i], dp[j][ki - 1].maxs * a[i]));  
            }  
        }  
    }  
    for(int i = 1; i <= n; ++i) {  
        ans = max(ans, dp[i][k].maxs);  
    }  
    printf("%lld\n", ans);  
}  
int main() {  
    while(scanf("%d", &n) != EOF) {  
        input();  
        solve();  
    }  
    return 0;  
}  
image

技术知识点

软件测试方法**

软件研发过程中产生的所有文档和代码都可以称之为软件产品,同时,只要是软件产品,都是测试的对象,即软件测试对象为软件生命周期中产生的所有文档和代码。

1. 根据利用的被测对象信息的不同,将软件测试方法分为黑盒测试、灰盒测试和白盒测试。

白盒测试

1)定义:是依据被测软件分析程序内部构造,并根据内部构造分析用例,来对内部控制流程进行测试,可完全不顾程序的整体功能实现情况,即已知软件产品的内部实现过程,可以通过测试证明每种内部操作是否符合设计规格的要求,所有内部成分是否已经过检查。

2)思想:白盒测试又被称为玻璃盒测试、透明盒测试、开放盒测试、结构化测试、逻辑驱动测试、是基于程序结构的逻辑驱动测试。

3)测试对象: 函数、算法与数据结构

4)目的

a. 一般在测试前期进行,通过达到一定的逻辑覆盖率指标,使得软件内部逻辑控制结构上的问题能基本得到消除;

b. 保证内部结构达到一定的覆盖程度,能够给予软件代码质量更大的保证;

c. 白盒测试发现问题后,解决问题的成本较低。

5)白盒测试的常用技术

a. 静态分析:包括控制流分析、数据流分析、信息流分析

b. 动态分析:逻辑覆盖测试(分支测试、路径测试等)、程序插装等

逻辑覆盖测试根据覆盖的对象不同,可以分为:语句覆盖、判定(分支)覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

程序插装指调试程序时,在程序中插入一些打印语句,程序执行时打印出我们关心的信息,通过这些信息了解执行过程中程序的一些动态行为。

逻辑覆盖率的统计通过程序插装来实现。

6)白盒测试的特点:

  a. 测试人员需要了解软件的实现;

  b. 可以检测代码中的每条分支和路径;

  c. 揭示隐藏在代码中的错误;

  d. 对代码的测试比较彻底;

  e. 实现代码结构上的优化;

  f. 投入较大,成本高;

  g. 无法检测代码中遗漏的路径和数据敏感性错误;

  h. 不验证规格的正确性。

黑盒测试

1)定义:把测试对象看成是一个黑盒,只考虑其整体特性,不考虑其内部具体实现过程。即已知产品的需求规格,但不知其内部实现,可以进行测试证明每个需求是否实现。

2)思想:基于规格的测试,测试类型都来源于质量模型。

3)测试对象:系统、子系统、模块、子模块、函数等。

4)常用的黑盒测试方法:等价类划分法、边界值分析法、因果图分析法、判定表法、状态迁移法等。

5)目的:减少测试时的测试用例数,用尽量少的测试用例完成测试,发现更多的问题。

6)黑盒测试的特点

  a. 对于更大的代码单元来说(子系统甚至系统级)比白盒测试效率要高;

  b. 测试人员不需要了解软件的实现细节,包括特定的编程语言;

  c. 从用户的视角进行测试,很容易被理解和接受;

  d. 有助于暴露任何规格不一致或有歧义的问题;

  e. 没有清洗和简明的规格,测试用例很难设计;

  f. 不能控制内部执行路径,会有很多内部程序路径没有被测试到;

  g. 不能直接针对特定的程序段,这些程序可能非常复杂(因此可能隐藏更多的问题)

灰盒测试

利用被测对象的整体特性信息,采用黑盒测试方法;利用被测对象的内部具体实现信息,采用白盒测试方法;介于白盒和黑盒测试之间的测试方法测试方法称之为灰盒测试。

1)定义:如果即利用被测对象的整体特性信息,又利用被测对象的内部具体实现信息,采用得就是灰盒测试方法。两种信息占得比例不同,相应的灰度就不同。

2)适用对象:一般集成测试采用灰盒测试方法。

2. 按照被测试的软件系统是否运行,将测试分为静态测试和动态测试。

静态测试

1)定义:不运行被测试的软件系统,而是采用其他手段和技术对被测试软件进行检测的一种测试技术,例如:代码走读、文档评审、程序分析等。

2)常用技术:静态分析技术。

  a. 定义:静态分析是一种不通过执行程序而分析程序的技术。

  b. 功能:检查软件的表示和描述是否一致,没有冲突或者没有歧义

  c. 目的:纠正软件系统在描述、表示和规格上的错误,因此是任何进一步测试的前提。

  d. 静态分析技术主要有3种不同的程序测试可能性

     *1*:考虑程序是否满足编码规则,语法上是否具有一致性和完整性;

     *2*:考虑文档描述是否规范、准确、便于查阅;

     *3*:考虑程序和文档之间的一致性。

  e. 静态分析技术有:控制流分析、数据流分析和信息流分析,下面简单介绍:

     *1*:控制流分析

       #1# 控制流相关概念

       ① 程序元素:一个程序元素通常是一个条件,一个简单的语句或者一块语句(多个连续语句)。

       ② 控制流关系:一个程序的控制流关系(Control FlowRelation)叙述了程序元素和他们执行的次序之间的关系。

       ③ 控制流图:对应于控制流关系的图被称为控制流图。

       ④ 控制流矩阵:有控制流图得到,反映相邻程序元素之间的先后顺序关系。

      #2# 控制流分析能发现的问题

      通过对控制流信息进行分析,确保写出的程序不应包含:转向并不存在的标号;没用的语句标号;从程序入口进入后无法达到的语句;不能达到停机语句的语句。

     *2*:数据流分析

      #1# 数据流相关概念

      数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化(代码优化主要包含:结构优化即可读性、时间效率和空间效率优化、可移植性优化)。

      数据流分析法关键是数据的引用和定义。

       ① 数据的定义:如果程序中某一语句执行时能改变某程序变量V的值,则称V是被该语句定义的。

       ② 数据的引用:如果程序中一语句的执行引用了内存中变量V的值,则称V是被该语句引用的。

       #2# 数据流分析步骤

       ① 根据代码得到数据流表

       ② 分析数据流表找到以下两种错误:

            变量未定义但被引用

            变量定义但未被引用

动态测试

1)定义:按照预先设计的数据和步骤去运行被测软件系统,从而对被测试软件进行检测的一种测试技术。

2)特点:主要分析软件系统在模拟或是真实的环境中执行之前、之中、之后的动态行为。

3)常用技术:动态分析技术

  a. 定义:对软件系统运行行为进行分析,包含程序在受控的环境下使用特定的输入进行正式的运行,和期望的结果比较以检查系统运行是正确还是不正确。

  b. 常用动态分析技术:

    *1*:路径测试

    *2*:分支测试

    *3*:性能测试

  c. 常用动态分析工具及功能

    *1*:测试覆盖率分析:用于测试对代码的检测范围;

    *2*:跟踪:跟踪程序执行期间的所有路径

    *3*:调整:度量程序执行过程中所有的资源

    *4*:模拟:模拟系统的部分

3. 所有测试方法都可以归类为手工测试和自动化测试。

手工测试

1)定义:手工测试是传统的测试方法,由测试人员手工编写测试用例,执行,观察结果。

2)缺点:测试工作量大,重复多,回归测试难以实现

自动化测试

1)定义:自动化测试指利用软件测试工具自动实现全部或者部分测试工作:管理、设计、执行和报告,自动化测试节省大量的测试开销,并能够完成一些手工测试无法实现的测试。

2)自动化测试的意义

  a. 对程序新版本运行前一版本执行的测试,提高回归测试效率

  b. 可以运行更多更频繁的测试

  c. 可以执行手工测试困难或不可能做到的测试,比如大量的重复操作或者集成测试

  d. 更好的利用资源,比如测试仪器或者被测对象

  e. 测试具有一致性和可重复性,及自动化测试的步骤和结果完全一样的测试的复用性,及自动化测试甲苯可以拆分开给其他测试脚本使用

  f. 可以更快地将软件推向市场,软件发布前进行高效的回归测试,减少软件发布的时间

  g. 增加软件的信任度,通过自动化测试提高了测试效率,可以吧节约的时间拿出来做更多的测试

3)自动化测试的限制

  a. 不能取代手工测试,自动化测试只能提高测试效率,不能提高测试有效性,即不可能发现更多缺陷更多

  b. 对测试设计依赖性极大,测试设计的不好会遗漏问题

  c. 自动化测试对软件开发具有很大的依赖性,开发出现变更可能导致前面的自动化测试完全失效

  d. 工具本身并不具备想象力,工具不具有智能

4)自动化测试的误区

  a. 不现实的期望,希望自动化能取代手工测试

  b. 缺乏测试实践经验,手工测试都做不好,或者经验积累不够,就尝试自动化,很难成功

  c. 期望自动化测试发现大量新缺陷,自动化只能保证测试执行效率,确保已有的问题不会再发生,发现新缺陷不是其目的

  d. 安全性错觉,认为进行了自动化测试的软件就是安全的、质量有保证的只有手工测试做好了,明确了测试的观察点,才能把自动化测试做好,所以手工测试是自动化测试的一个基础

大厂暑期实习的招聘已到中后期,大部分的同学手中还没有offer,一部分的同学在备胎池中煎熬着。但是,那一小部分已经拿到offer的同学,不一定就在轻轻松松的玩耍,人家说不定比你更努力。幸运总是会眷顾有准备的人,小伙伴们,跟着【19应届生】学习产品知识,我们一起加油吧~!

image

你可能感兴趣的:(程序员面试修炼09 | 网易2016内推笔试题)