数据流测试简易计算器

数据流测试

测试思路

数据流测试是针对数据内容进行测试的测试方法,因此个人认为应该分为全局变量和局部变量分别测试
在计算器代码中,TokenStream和Error类是每个计算唯一的,同时每个计算部分的val是连续的流,分析的时候应该改着眼于全局的数据流图,而函数内部变量如token只需要在函数级别进行跟踪,画出数据流图
数据流图可以使用processon进行绘制

测试代码

public class HandlerFunction implements FunctionHanlder {
  @Override
  public double single(Token_Stream ts, Error error) {
    double val = primary(ts, error);
    Token token = ts.get();
    if (token.getKind() == '!') {
      int tempValue = (int) val;
      if (tempValue == val) {
        int a = (int) val;
        val = fac(a);
        return val;
      } else {
        error.setError(4);
      }
    } else {
      ts.push_back(token);
    }
    return val;
  }

  @Override
  public double term(Token_Stream ts, Error error) {
    double val = single(ts, error);
    while (true) {
      Token token = ts.get();
      switch (token.getKind()) {
        case '*':
          val *= single(ts, error);
          break;
        case '/':
          double a;
          a = single(ts, error);
          if (a == 0) {
            error.setError(1);
          } else
            val /= a;
          break;
        case '%':
          double b;
          b = single(ts, error);
          if (val != (int) val || b != (int) b) {
            error.setError(2);
          } else if (b == 0) {
            error.setError(3);
          } else {
            int c = (int) val;
            int d = (int) b;
            val = c % d;
          }
          break;
        default:
          ts.push_back(token);
          return val;
      }
    }
  }

  @Override
  public double expression(Token_Stream ts, Error error) {
    double val = term(ts, error);
    Token t = ts.get();
    while (t.getKind() == '+' || t.getKind() == '-') {
      if (t.getKind() == '+') {
        val += term(ts, error);
        t = ts.get();
      }
      if (t.getKind() == '-') {
        val -= term(ts, error);
        t = ts.get();
      }
    }
    ts.push_back(t);
    return val;
  }

  @Override
  public double primary(Token_Stream ts, Error error) {
    Token token = ts.get();
    double val = 0;
    switch (token.getKind()) {
      case '8':
        val = token.getValue();
        break;
      case '(':
        val = expression(ts, error);
        token = ts.get();
        if (token.getKind() != ')') {
          error.setError(5);
        }
        break;
      case '+':
        val = primary(ts, error);
        break;
      case '-':
        val = -primary(ts, error);
        break;
      default:
        error.setError(6);
    }
    return val;
  }

  @Override
  public int fac(int val) {
    if (val == 0) {
      return 1;
    } else {
      int a = Math.abs(val);
      return val * fac(a - 1);
    }
  }
}

<a href=""

针对ts变量

数据流图中红色为def,蓝色为def/use,绿色为use,虚线为函数调用

def/use图
函数def行数use行数
main36
expression2, 6, 9, 101, 2, 5, 6, 8, 9
term3, 291, 3, 6, 10, 18
single2, 121, 2
primary1, 91, 8, 9, 15, 18
数据流图

在这里插入图片描述

路径
函数def行数use行数
expression2, 6, 9, 101, 2, 5, 6, 8, 9
定义节点使用节点路径
25<2, 3, 4, 5>
28<2, 3, 4, 7, 8>
29<2, 3, 4, 7, 8, 9>
68<6, 7, 8>
69<6, 7, 8, 9>
95<9, 3, 4, 5>
96<9, 3, 4, 5, 6>
1, 5, 9primary的1<1或5或9, term的1, single的1, primary的1>
10primary的8<10, 11, primary的8>
数据流图

在这里插入图片描述

路径
函数def行数use行数
term3, 291, 3, 6, 10, 18
定义节点使用节点路径
36< 3, 4, 5, 6>
310< 3, 4, 8, 9, 10>
318< 3, 4, 17, 18>
{1, 6, 10, 18}primary的1<{1, 6, 10, 18}, single的1, primary的1>
29expression的{1, 5, 8}<29, 30, expression的{1, 5, 8}>
数据流图

在这里插入图片描述

路径
函数def行数use行数
single2, 121, 2
定义节点使用节点路径
1primary{1}<1, primary{1}>
12term{1, 6, 10, 18}<1, term{1, 6, 10, 18}>
数据流图

在这里插入图片描述

路径
函数def行数use行数
primary1, 91, 8, 9, 15, 18
定义节点使用节点路径
18<1, 2, 3, 7, 8>
19<1, 2, 3, 7, 8, 9>
115<1, 2, 3, 13, 14, 15>
118<1, 2, 3, 16, 17, 18>
81<8, expression{1}, term{1}, single{1}, 1>
9single{1}<9, {10, 11, 12}/{10, 12}, 21, single{1}>
覆盖指标

使用全使用覆盖标准

针对value变量
def/use图
函数def行数use行数
primary2,5,8,14,1721
expression1,5,811
term1,6,14,19,2619, 24,30
single1,74, 5, 6, 8, 13
value12,5,6
  • value变量在primary函数中(红色代表定义节点,紫色代表使用节点,绿色表示定义/使用节点)
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
221<2,3,7,8,9,10,11,12,21>
521<5, 6, 21>
821<8, 9, 10, 11, 12, 21>
1421<14, 15, 21>
1721<17, 18, 21>
测试用例测试路径期望结果
new TokenStream(“5”), new Error()<2,3,7,8,9,10,11,12,21>, <5, 6, 21>5
new TokenStream("(1+1)"), new Error()<8, 9, 10, 11, 12, 21>2
new TokenStream("+1"), new Error()<14, 15, 21>1
new TokenStream("-1"), new Error<17, 18, 21>-1
  • value变量在expression函数中(红色代表定义节点,紫色代表使用节点,绿色表示定义/使用节点)
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
111<1,2,3,4,5,6,7,8,9,10,11>
511<5, 6,10,11>
811<8, 9, 10, 11>
测试样例测试路径期望结果
new TokenStream(“1+1”), new Error()<1,2,3,4,5,6,7,8,9,10,11>,<5, 6,10,11>2
new TokenStream(“1-1”), new Error()<8, 9, 10, 11>0
  • value变量在term函数中(红色代表定义节点,紫色代表使用节点,绿色表示定义/使用节点)
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
119<1, 2, 3, 4, 16,17,18,19>
124<1,2,3,4,16,17,18,19,23,24>
130<1,2,3,4,28,29,30>
619<6,7,2,3,4,16,17,18,19>
624<6,7,2,3,4,16,17,18,19,23,24>
630<6,7,2,3,4,28,29,30>
1419<14,15,2,3,4,16,17,18,19>
1424<14, 15, 2,3,4,16,17,18,19,23,24>
1430<14,15,2,3,4,28,29,30>
1924<19,20,27,2,3,4,16,17,18,19,23,24>
1930<19,20,27,2,3,4,28,29,30>
2619<26,27,2,3,4,16,17,18,19>
2624<26, 27,2,3,4,16,17,18,19,23,24>
2630<26,27,2,3,4,28,29,30>
测试样例测试路径期望结果
new TokenStream(“1*1”), new Error()<1,2, 3, 4, 16,17,18,19>, <1,2,3,4,28,29,30>,<6,7,2,3,4,28,29,30>1
new TokenStream(“1%2”), new Error()<1,2,3,4,16,17,18,19,23,24>,<1, 2, 3, 4, 16,17,18,19>, <19,20,27,2,3,4,16,17,18,19,23,24>, <19,20,27,2,3,4,28,29,30>,<26,27,2,3,4,28,29,30>1
new TokenStream(“1*2%3”), new Error()<6,7,2,3,4,16,17,18,19>, <6,7,2,3,4,16,17,18,19,23,24>,2
new TokenStream(“1+1”), new Error()<1,2,3,4,28,29,30>1
new TokenStream(“6/3%3”), new Error()<14,15,2,3,4,16,17,18,19>, <14, 15, 2,3,4,16,17,18,19,23,24>2
new TokenStream(“6/3”), new Error()<14,15,2,3,4,28,29,30>2
new TokenStream(“3%4%2”)<26,27,2,3,4,16,17,18,19>, <26, 27,2,3,4,16,17,18,19,23,24>1
  • value变量在single函数中
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
14<1,2,3,4>
15<1,2,3,4,5>
16<1,2,3,4,5,6>
18<1,2,3,4,5,6,7,8>
113<1,2,3,11,12,13>
78<7,8>
测试用例测试路径期望结果
new TokenStream(“3!”)<1,2,3,4>,<1,2,3,4,5>, <1,2,3,4,5,6>, <1,2,3,4,5,6,7,8>, <7, 9>6
new TokenStream(“3”)<1,2,3,11,12,13>3
  • value变量在fac函数中

在这里插入图片描述

定义节点使用节点路径
121,2
151,2,4,5
161,2,4,5,6
测试用例测试路径期望结果
fac(3)<1,2>, <1,2,4,5>, <1,2,4,5,6>6
针对token变量
函数定义节点使用节点
expression2,6,93,4,7,10
term34, 29
single23, 12
primary1,93,5,10
  • token变量在expression函数中
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
23<2,3>
24<2,3,4>
27<2,3,4,5,6,7>
210<2,3,10>
67<6,7>
610<6,7,8,9,10>
910<9, 10>
测试样例测试路径期望结果
new TokenStream(“1+1”), new Error()<2,3>,<2,3,4>,<2,3,4,5,6,7>,<6,7>,<6,7,8,9,10>2
new TokenStream(“1*1”), new Error()<2,3,10>1
new TokenStream(“1-1”), new Error()<9,10>1
  • token变量在term函数中
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
34❤️,4>
329❤️,4,28,29>
测试用例测试路径期望结果
new TokenStream(“1”), new Error()❤️,4>, ❤️,4,28,29>1
  • token变量在single函数中
数据流图

路径
定义节点使用节点路径
23<2,3>
212<2,3,11,12>
测试用例测试路径期望结果
new TokenStream(“1”), new Error()<2,3>,<2,3,11,12>1
  • token变量在primary函数中
数据流图

在这里插入图片描述

路径
定义节点使用节点路径
13<1,2,3>
15<1,2,3,4,5>
110<1,2,3,7,8,9,10>
910<9,10>
测试用例测试路径期望结果
new TokenStream(“1”), new Error()<1,2,3>, <1,2,3,4,5>1
new TokenStream("(1+1)"), new Error<1,2,3,7,8,9,10>,<9,10>2
覆盖指标

这里采用了全使用的覆盖指标,包括从每个定义节点到所有谓词使用的定义清除路径

注:后半部分为吕艺共同参与所作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值