当前位置:   article > 正文

任务06——封装与单元测试(Markdown版)

markdown单元测试

模块代码地址

两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了。

封装阶段

  1. public class Core {
  2. public static StringBuffer Suffix(StringBuffer infix){
  3. Stack<Character> stack=new Stack <Character>();
  4. StringBuffer suffix=new StringBuffer();
  5. int i=0;
  6. char tempchar=infix.charAt(i++);
  7. char tempchar2=' ';
  8. try {
  9. while (tempchar!='='){
  10. switch (tempchar){
  11. case '(':
  12. stack.push(tempchar);
  13. tempchar=infix.charAt(i++);
  14. break;
  15. case ')':
  16. while (stack.peek()!='('){
  17. tempchar2=stack.pop();
  18. suffix.append(tempchar2);
  19. suffix.append(' ');
  20. if (stack.empty()) {
  21. break;
  22. }
  23. }
  24. if (!stack.empty()) {
  25. stack.pop();
  26. }
  27. tempchar=infix.charAt(i++);
  28. break;
  29. case '+':
  30. case '-':
  31. while (!stack.empty()&&stack.peek()!='('){
  32. tempchar2=stack.pop();
  33. suffix.append(tempchar2);
  34. suffix.append(' ');
  35. }
  36. stack.push(tempchar);
  37. tempchar=infix.charAt(i++);
  38. break;
  39. case '×':
  40. case '*':
  41. case '/':
  42. case '÷':
  43. Character ch=new Character(' ');
  44. if (!stack.empty()) {
  45. while((ch=stack.peek()).equals('×')||(ch=stack.peek()).equals('÷'))
  46. {
  47. tempchar2=stack.pop();
  48. suffix.append(tempchar2);
  49. suffix.append(' ');
  50. if (stack.empty()) {
  51. break;
  52. }
  53. }
  54. }
  55. stack.push(tempchar);
  56. tempchar=infix.charAt(i++);
  57. break;
  58. case ' ':
  59. tempchar=infix.charAt(i++);
  60. break;
  61. default:
  62. while(tempchar<='9'&&tempchar>='0')
  63. {
  64. suffix.append(tempchar);
  65. tempchar=infix.charAt(i++);
  66. }
  67. suffix.append(' ');
  68. break;
  69. }
  70. }
  71. while(!stack.empty())
  72. {
  73. tempchar2=stack.pop();
  74. suffix.append(tempchar2);
  75. suffix.append(' ');
  76. }
  77. suffix.append('\0');
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. return suffix;
  82. }
  83. //根据后缀表达式计算结果(小数格式的String类型)
  84. public static String Calculate(StringBuffer suffix){
  85. int i=0;
  86. char tempchar=suffix.charAt(i++);
  87. double []answer=new double[20];
  88. int top=0,d;
  89. String Answer= null;
  90. try {
  91. while (tempchar!='\0'){
  92. switch (tempchar){
  93. case '+':
  94. answer[top-1]=answer[top-1]+answer[top];
  95. top--;
  96. tempchar=suffix.charAt(i++);
  97. break;
  98. case '-':
  99. answer[top-1]=answer[top-1]-answer[top];
  100. top--;
  101. tempchar=suffix.charAt(i++);
  102. break;
  103. case '*':
  104. case '×':
  105. answer[top-1]=answer[top-1]*answer[top];
  106. top--;
  107. tempchar=suffix.charAt(i++);
  108. break;
  109. case '/':
  110. case '÷':
  111. try {
  112. if(answer[top]!=0)
  113. answer[top-1]=answer[top-1]/answer[top];
  114. else
  115. {
  116. System.out.println("\n\t除零错误!\n");
  117. throw new InvalidExpression("无效的表达式");
  118. }
  119. } catch (InvalidExpression invalidExpression) {
  120. invalidExpression.printStackTrace();
  121. System.exit(0);
  122. }
  123. top--;
  124. tempchar=suffix.charAt(i++);
  125. break;
  126. case ' ':
  127. tempchar=suffix.charAt(i++);
  128. break;
  129. default:
  130. d=0;
  131. while(tempchar>='0'&&tempchar<='9')
  132. {
  133. d=10*d+tempchar-'0';//将数字字符转化为对应的数值
  134. tempchar=suffix.charAt(i++);
  135. }
  136. top++;
  137. answer[top]=d;
  138. break;
  139. }
  140. }
  141. Answer = null;
  142. if (top!=1){
  143. throw new InvalidExpression("无效的表达式");
  144. }
  145. Double an=new Double(answer[top]);
  146. Answer = new String(an.toString());
  147. }catch (InvalidExpression invalidExpression) {
  148. invalidExpression.printStackTrace();
  149. }catch (Exception e) {
  150. e.printStackTrace();
  151. }
  152. return Answer;
  153. }
  154. }

在封装的过程中遇到的困难,以及是如何解决的:

1100697-20170427124741131-1096628975.png

对于封装首先想到几天前学习的软件工程的知识,关于模块的分解、抽象,恰好与本次的任务吻合,可以理论用于实践。上图是我画的UML图,在尝试在学习中,算不上很规范,但能基本看懂大概的结构。
因为之前的代码基于结构化编程,运用函数思想,所以在本次封装过程中很好的将功能抽象出来,这次完成的虽然不是很完美,但后期可以通过老师的指导不断改进。

单元测试阶段

单元测试代码 此处粘贴单元测试代码(用一对 把代码括起来) public class CoreTest {

  1. @Before
  2. public void before() throws Exception {
  3. }
  4. @After
  5. public void after() throws Exception {
  6. }
  7. /**
  8. *
  9. * Method: Suffix(StringBuffer infix)
  10. *
  11. */
  12. @Test
  13. public void testSuffix() throws Exception {
  14. Core s=new Core();
  15. s.Suffix(new StringBuffer("1+2+3="));
  16. s.Suffix(new StringBuffer("1+2×3="));
  17. s.Suffix(new StringBuffer("1+2÷3="));
  18. s.Suffix(new StringBuffer("1÷2×3="));
  19. s.Suffix(new StringBuffer("1÷+2×3="));
  20. s.Suffix(new StringBuffer("1÷2*3="));
  21. s.Suffix(new StringBuffer("1÷0×3="));
  22. s.Suffix(new StringBuffer("1÷2×0="));
  23. }
  24. /**
  25. *
  26. * Method: Calculate(StringBuffer suffix)
  27. *
  28. */
  29. @Test
  30. public void testCalculate() throws Exception {
  31. Core s=new Core();
  32. s.Calculate(new StringBuffer("1 2 + 3 +"));
  33. s.Calculate(new StringBuffer("1 + 2 + 3 +"));
  34. s.Calculate(new StringBuffer("1 2 +"));
  35. s.Calculate(new StringBuffer("1 2 × 3 +"));
  36. s.Calculate(new StringBuffer("1+ + 2 × 3 +"));
  37. }
  38. }

```

单元测试运行结果(截图,含测试是否全部通过,代码覆盖率等)

1100697-20170427124820147-372622570.png
1100697-20170427124823053-789133932.png
1100697-20170427124826834-1015767284.png

在编写单元测试代码过程中遇到的困难,以及是如何解决的

按照老师提供的教程,一开始看不懂,需要自己慢慢琢磨,Junit包,不知道是哪个,IDEA上找到有好多个,后来自己在网上找一个发现可以用。
下面提供它的下载网址。
链接:http://pan.baidu.com/s/1o84pWQQ 密码:1mda

别的大问题没有,关于对Core的测试,计算表达式都是自己按照规则生成的,不会出现不规则的情况,
所以对于测试情况的全面性没有更深一步进行。

感受(小结)

Junit很方便,测试的时候,不能以编程时的思维方式去看待问题,否则有些问题永远测试不出来。
需要打破常规的思路,不能认为自己的代码运行结果都是对的。

转载于:https://www.cnblogs.com/jinxiaohang/p/6773642.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/136774
推荐阅读
相关标签
  

闽ICP备14008679号