首页 > 其他分享 >在PA2中学到的有关编写测试用例的经验补充

在PA2中学到的有关编写测试用例的经验补充

时间:2022-10-05 14:23:13浏览次数:43  
标签:输出 PA2 函数 val int 写入 测试用例 编写 data

来源:ysyx5期, PA2 基础设施(2)-  “测试你的klib”

  1. 内存和字符串的写入函数, 例如memset()strcpy()等.
  2. 内存和字符串的只读函数, 例如memcmp()strlen()等.
  3. 格式化输出函数, 例如sprintf()等.

如何进行充分的测试:

1. 在可以遍历输入范围时,遍历输入范围

针对第一类函数, 我们应该如何构造一个测试场景, 使得存在一些方法来容易地得到测试输出呢? 注意这些函数都是对一个内存区域进行写入, 考虑如下的数组:

#define N 32
uint8_t data[N];

void reset() {
  int i;
  for (i = 0; i < N; i ++) {
    data[i] = i + 1;
  }
}
 

这样的一个数组, 每个元素都是1个字节, 而且它们的值都各不相同. 如果我们在这个数组上进行测试, 只要实际输出有1个字节不正确, 都可以大概率被检查出来. 为了得到预期的输出, 我们还要思考测试函数的预期行为: 以上函数都是对数组中的一段连续区间进行写入, 于是我们可以把预期的输出分成三段来检查:

  • 第一段是函数写入区间的左侧, 这一段区间没有被写入, 因此应该有assert(data[i] == i + 1)
  • 第二段是函数写入的区间本身, 这一段区间的预期结果和函数的具体行为有关
  • 第三段是函数写入区间的右侧, 这一段区间没有被写入, 因此应该有assert(data[i] == i + 1)

于是我们可以编写两个辅助函数用于检查:

// 检查[l,r)区间中的值是否依次为val, val + 1, val + 2...
void check_seq(int l, int r, int val) {
  int i;
  for (i = l; i < r; i ++) {
    assert(data[i] == val + i - l);
  }
}

// 检查[l,r)区间中的值是否均为val
void check_eq(int l, int r, int val) {
  int i;
  for (i = l; i < r; i ++) {
    assert(data[i] == val);
  }
}
 

有了这两个函数, 我们就可以遍历各种输入, 并且很容易地编写出测试函数的预期输出了. 例如针对memset(), 我们可以编写如下的测试代码:

void test_memset() {
  int l, r;
  for (l = 0; l < N; l ++) {
    for (r = l + 1; r <= N; r ++) {
      reset();
      uint8_t val = (l + r) / 2;
      memset(data + l, val, r - l);
      check_seq(0, l, 1);
      check_eq(l, r, val);
      check_seq(r, N, r + 1);
    }
  }
}


2. 在输入范围过大时,我们选取有代表性的输入

最后我们来看格式化输出函数. 以%d为例, 我们需要构造一些输入. 但整数的范围太大了, 不能全部遍历它们, 因此我们需要挑选一些有代表性的整数. limits.h这个C标准头文件里面包含了一些最大数和最小数的定义, 你可以打开/usr/include/limits.h来阅读它们. 一些有代表性的整数可以是:

int data[] = {0, INT_MAX / 17, INT_MAX, INT_MIN, INT_MIN + 1,
              UINT_MAX / 17, INT_MAX / 17, UINT_MAX};
 

为了得到相应的预期输出, 我们可以先编写一个native程序来用printf输出它们, 然后把输出结果整理到测试代码里面. cpu-tests中的预期输出也是这样生成的.

 

标签:输出,PA2,函数,val,int,写入,测试用例,编写,data
From: https://www.cnblogs.com/yinhuachen/p/16755504.html

相关文章

  • 干货 | 实战演练基于加密接口测试测试用例设计
    如果接口测试仅仅只是掌握一些requests或者其他一些功能强大的库的用法,是远远不够的,还需要具有根据公司的业务以及需求去定制化一个接口自动化测试框架能力。所以在这个部分......
  • 键盘记录器编写笔记
    目录键盘Hook目的实现头文件全局变量DllMain函数Install函数Remove函数KeyboardProc函数DLL调试遇到的问题WindowsAPI例程键盘Hook目的利用Windows钩子监控键盘事件,记......
  • 编写webpack 插件
    Webpack插件为第三方开发者释放了Webpack的最大可能性。利用多级回调开发者可以把他们自己的需要的功能引入到Webpack里面来。Build插件比Buildloader更进一步。因为你需......
  • eBPF 入门实践教程(一):编写 eBPF 程序监控打开文件路径并使用 Prometheus 可视化
    背景通过对open系统调用的监测,​​opensnoop​​可以展现系统内所有调用了open系统调用的进程信息。使用ecli一键运行$#下载安装ecli二进制$wgethttps://aka.pw......
  • 一个编写测试键盘的javascript程序和测试键盘的程序
    代码很简单,直接上代码:<!DOCTYPEhtml><html><head><title>Keyboardinput</title></head><body><canvasid='canvas'width='700'he......
  • 对使用网站模板编写自己的jsp页面的收获
    收获与问题先感叹一句模板的强大,模板只要按照我的上一篇博客的步骤进行修改,我们就能拥有一个自己写好看许多的界面了。我目前套用模板还不是很熟练,套用的速度还需要加快,......
  • 对利用jsp模板编写登录、注册界面的方法言
    使用模板的相关操作步骤详解1、可以在相关的网站上面找相关的css或者js文件,下载到一个特定的文件夹里面,以备使用2、然后,将存有相关代码的文件夹直接复制粘贴到web文件下,......
  • 邮件正则无表达式编写
    email_reg=/^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]+){1,2}$/;说明:^\w表示以字母、数字或下划线开头,{3,}表示至少要三个字符\.表示邮件中的.,\是转义用的,w+表示一个或多个......
  • Java - 编写和编译引用自己的类库
    Java-编写自己的类库2021-08-02   许多程序代码我们先用到以后的开发中。比如:排序算法等。避免每次使用都要重新写一遍这些代码。如果可以像调用jdk一样的方法......
  • 测试用例框架——C语言
    测试用例框架——C语言目录测试用例框架——C语言1宏定义2初始化函数3测试的结果函数4状态测试函数5字符串的比较函数6值比较函数1宏定义staticintTestNum=......