使用junit测试

package creeper;

import java.util.Scanner;

public class size {
 private static int intercePosition = 0; // 记录单个运算数据的长度
 private static int[] intercePositionIndex = null; // 记录“(”的下标
 private static int[] intercePositionEnd = null; // 记录“)”的下标

 public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
  do {
   System.out.println("请输入你要计算的字符串(注意:只能输入数字和加,减,乘除符号;输入完毕后,请直接回车):");
   String numberString = input.next().trim();
   // 判断输入的运算字符串是否符合规定
   if (ispassString(numberString) == false) {
    System.out.println("您输入的计算字符串有误,请正确输入!");
   } else {
    // 计算结果返回
    System.out.println(interceResult(numberString));
   }
  } while (true);
 }

 // 判断是否有带括号的运算字符串存在
 private static String interceResult(String str) {
  String result = str;
  char[] numberString = str.toCharArray(); // 1+2+(1*2+1-1*2+5)+2+(1+5+9+10-11)+1*5/2+3
  // 1+8-9+(1*8/2-5+(1+2+8))+4/5*8/3*2
  int IndexStart = 0; // 记录“(”的实际数量
  int EndStart = 0; // 记录“)”的实际数量
  for (int i = 0; i < numberString.length; i++) {
   if (‘(‘ == numberString[i]) {
    // 记录最后一个正括号的位置
    IndexStart = i;
   }
   if (‘)‘ == numberString[i]) {
    // 记录反括号的最初始下标的位置
    EndStart = i;

    // 截取最里面一个括号里的运算字符串
    result = result.substring(IndexStart + 1, EndStart);

    // 截取括号的运算字符串进行运算,生成新的运算字符串
    result = str.substring(0, IndexStart)
      + interceptOperation(result, ‘*‘, ‘/‘)
      + str.substring(EndStart + 1, str.length());

    // 回调执行,其它小括号的运算字符串
    return interceResult(result);
   }
   if (i == numberString.length - 1)
    if (EndStart == 0)
     break;
  }
  // 不存在括号了,再进行混合运算
  result = interceptOperation(str, ‘*‘, ‘/‘);
  return result;
 }

 // 不带括号的四则运算
 private static String interceptOperation(String operationNumber, char a,
   char b) {
  String mess = operationNumber;
  char[] stringOperation = mess.toCharArray();

  // 循环遍历运算字符串,并做相应的运算
  for (int i = 0; i < stringOperation.length; i++) {

   // 判断运算符所在的索引
   if (stringOperation[i] == a || stringOperation[i] == b) {
    if (i != 0) {
     // 运算符前的第一个数
     double num1 = interceptNumIndex(mess.substring(0, i));

     // 记录第一个数据的长度
     int frontPosition = intercePosition;

     // 运算符前的第二个数
     double num2 = interceptNumEnd(mess.substring(i + 1,
       stringOperation.length));

     // 记录第二个数据的长度
     int backPosition = intercePosition;

     // 算完乘除,将结果替换到原来运算的位置,得到新的运算字符串
     String IndexMess = mess.substring(0, i - frontPosition + 1);
     String IndexResult = "";

     // 判断是否运算到最后的结果了
     if (IndexMess.indexOf(‘+‘) == -1
       && IndexMess.indexOf(‘*‘) == -1
       && IndexMess.indexOf(‘/‘) == -1
       && IndexMess.lastIndexOf(‘-‘) == -1)
      IndexMess = "";
     if (IndexMess != "")
      IndexResult = IndexMess.lastIndexOf(‘-‘) == IndexMess
        .length() - 1 ? IndexMess.substring(0, i
        - frontPosition) : IndexMess;

     // 组装新的运算字符串
     mess = IndexResult// mess.substring(0,i-frontPosition+1)
       + reslutString("" + stringOperation[i], num1, num2)
       + mess.substring(i + backPosition + 1);
     // 0.111/1212/2/2/2/2/2/2/2
     if (mess.lastIndexOf(‘-‘) == 0 && mess.indexOf(‘+‘) == -1
       && mess.indexOf(‘*‘) == -1
       && mess.indexOf(‘/‘) == -1) {
      break;
     }
     // 回调,继续运算
     return interceptOperation(mess, a, b);// 1+7-5+89/3+4-6*8/2+4-6
    } else
     continue;
   }
   if (i == stringOperation.length - 1) {
    // 递归出口,判断是否还有运算字符串在
    if (mess.indexOf(‘+‘) != -1 || mess.indexOf(‘-‘) != -1)
     return interceptOperation(mess, ‘+‘, ‘-‘);
    break;
   }
  }
  return mess;
 }

 // 截取第二个数
 private static double interceptNumEnd(String str) {
  double a = 0;
  int InrerceIndex = 0;
  char[] stringOperation = str.toCharArray();
  boolean ispas = false; // 记录是否为负数
  for (int i = 0; i < stringOperation.length; i++) {
   switch (stringOperation[i]) {
   case ‘*‘:
   case ‘/‘:
   case ‘+‘:
   case ‘-‘:
    InrerceIndex = i;
    if (i != 0) // 判断该数是否为负数
     ispas = true;
    break;
   default:
    break;
   }
   if (ispas)
    break;
  }
  // 判断此数据是否在运算字符串的最后一位
  if (InrerceIndex == 0) {
   a = Double.parseDouble(str);
   intercePosition = str.length();
   if (ispas)
    intercePosition++;

  } else {
   a = Double.parseDouble(str.substring(0, InrerceIndex));
   // 记录数据的真实长度
   intercePosition = str.substring(0, InrerceIndex).length();
  }
  return a;
 }

 // 截取第一个数
 private static double interceptNumIndex(String str) {
  double a = 0; // 记录数据
  int InrerceIndex = 0; // 记录运算符的位置
  boolean temp = false; // 记录数据前运算符的状态
  char[] stringOperation = str.toCharArray();
  for (int i = stringOperation.length - 1; i >= 0; i--) {
   switch (stringOperation[i]) {
   case ‘*‘:
   case ‘/‘:

   case ‘+‘:
   case ‘-‘:
    InrerceIndex = i;
    temp = true;
    break;
   default:
    break;
   }
   if (temp)
    break;
  }
  // 判断此数据是否在运算字符串的第一位
  if (InrerceIndex == 0) {
   a = Double.parseDouble(str);
   intercePosition = str.length();
   // if(temp)
   // intercePosition++;
  } else {
   a = Double.parseDouble(str.substring(InrerceIndex, str.length()));
   // 记录数据的真实长度
   intercePosition = str.substring(InrerceIndex, str.length())
     .length();
  }
  return a;
 }

 // 计算结果
 private static double reslutString(String operation, double num1,
   double num2) {
  double sumResult = 0;
  if (operation.equals("*"))
   sumResult = num1 * num2;
  if (operation.equals("-"))
   sumResult = num1 - num2;
  if (operation.equals("/"))
   sumResult = num1 / num2;
  if (operation.equals("+"))
   sumResult = num1 + num2;
  return sumResult;
 }

 // 判断是否正确输入运算方式
 private static boolean ispassString(String messString) {
  boolean ispass = false;
  boolean operationIspass = true; // 记录被除数的状态
  int ai = 0; // 记录是否有运算符号的存在
  char[] IsString = messString.toCharArray();
  int num1 = 0;
  int num2 = 0;
  for (int i = 0; i < IsString.length; i++) {
   // 记录有几对小括号的存在
   if (‘(‘ == IsString[i])
    num1++;
   if (‘)‘ == IsString[i])
    num2++;

   // 判断除数是否为零
   if (‘/‘ == IsString[i] && IsString[i + 1] == ‘0‘)
    operationIspass = false;

   // 判断是否输入了运算符合
   if (IsString[i] == ‘+‘ || IsString[i] == ‘-‘ || IsString[i] == ‘*‘
     || IsString[i] == ‘/‘)
    ai++;

   if (i == IsString.length - 1)
    if (ai == 0)
     num2++;
  }
  if (operationIspass)
   if (num1 == num2)
    ispass = true;
  return ispass;
 }
}

运行结果如下

然后使用junit进行测试

测试代码如下

package creeper;

import static org.junit.Assert.*;

import org.junit.Test;

public class sizeTest {

    @Test
    public void testReslutString() {
    Double expectedAnswer = Double.valueOf(12);
    Double actualAnswer = Double.valueOf(2*6);
    assertEquals(expectedAnswer, actualAnswer);
    }

}

结果如下

测试条为绿色,说明测试结果与预期结果相同,程序没有问题

总结:

  经过对JUnit 的了解,简单对之前写的计算器代码做个测试,收获颇丰:JUnit作为最佳实践测试任何可能的错误。单元测试不是用来证明您是对的,而是为了证明您没有错。JUnit还有更强大的功能等着我们去探索。

时间: 2024-08-07 17:00:53

使用junit测试的相关文章

android junit 测试 简要步骤

android junit 测试 1.新建一个类继承TestCase这个类 2.AndroidManifest.xml, 加入<uses-library android:name="android.test.runner" /> <!-- 记住这个一要放在application外面,不然会出现配置错误 信息 -->      <instrumentation android:name="android.test.InstrumentationTe

Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至是出现之前解决了的问题再次重现. 这里主要是使用MockMvc对我们的系统的Controller进行单元测试. 对数据库的操作使用事务实现回滚,及对数据库的增删改方法结束后将会还远数据库. 二.MockMvc的使用 1.首先我们上一个例子, import org.apache.commons.log

Junit测试中的setup和teardown 和 @before 和 @After 方法

这几天做Junit测试接触到了setup和teardown两个方法,简单的可以这样理解它们,setup主要实现测试前的初始化工作,而teardown则主要实现测试完成后的垃圾回收等工作. 需要注意的是Junit3中每个测试方法执行时都会执行它们,而不是一个类中执行一次,查了查资料,JUnit4版本采用注解的方式可以实现一个类只执行一次,下面看看测试代码: jar下载地址: http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22junit%22%20

复利计算器(软件工程)及Junit测试———郭志豪

计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算,本息又是多少呢? 3.假如30年之后要筹措到300万元的养老金,平均的年回报率是3%,那么,现在必须投入的本金是多少呢? 4.利率这么低,复利计算收益都这么厉害了,如果拿100万元去买年报酬率10%的股票,若一切顺利,过多长时间,100万元就变成200万元呢? 5.如果我希望在十年内将100万元变

正则表达式 和 junit测试

需要知道一些常规的正则表达式语句,然后可以仿照规则写出一下正则表达式语句.然后是关于junit测试. 知道了一个之前看过的文档,然后有功夫就看一下那个文档就可以,或者后面找时间搜索一下. 正则表达式是一个字符串: 由^开头 由$结尾. []表示可取值的范围. \\d表示数字. 下面两个表达式等效: ^[0-9]*$ ^\\d*$ 都表示若干数字 下面这个表示多个汉字: ^[\u4e00-\u9fa5]{0,}$ 汉字的码集是从\u4e00-\u9fa5 所有英文字母和数字: ^[a-zA-Z0-

【Java 语言生态篇】Junit 测试单元

01 概述 JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework).Junit测试是白盒测试.JUnit有它自己的JUnit扩展生态圈.多数Java的开发环境都已经集成了JUnit作为单元测试的工具.[1] JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试.他是用于单元测试框架体系xUnit的一个实例(用于java语言).它包括以下特性: 1.用于测试期望结果的断言(Asser

Android Day02-Android中单元测试(junit测试)&monkey测试

Android中junit测试有2种实现方式 第1种:一般Android工程的实现方式 1.在清单文件中添加2项内容 首先在AndroidManifest.xml中加入下面红色代码: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.action" android:versionCode="1"  android:v

Junit 测试断言说明

Assert.assertEquals("发生错误时报告消息","预期值","生产值"); Assert.assertEquals("精确两位小数点",3.33,10.0/3.0,0.01); Assert.assertNotNull("");//验证是否为非空 Assert.assertNull(""); //验证是否为空 Assert.assertSame("",

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

使用JUnit测试java代码

Junit 单元测试实验报告  一.实验环境 MyEclipse2014.Junit4.10 二.实验目的 学会单元测试,在MyEclipse中进行Junit测试 三.实验步骤 1.写出要测试的类 代码如下: package com.cheng.test; public class Calculate { public int add(int a,int b) { return a+b; } public int sub(int a,int b) { return a-2*b;   //bug;