核心實驗:實現被測程序ArrayCompare代碼
來自專欄強哥學堂11 人贊了文章
實驗簡介
本節主要為大家梳理本測試項目的目標程序ArrayCompare的功能結構及具體代碼實現。
實驗目的
(1)掌握概要設計與介面設計的基本方法。
(2)能夠熟練快速地定位和梳理代碼邏輯。
(3)對代碼功能進行解讀,進而達到測試的目的。
實驗流程
- 代碼結構圖
2. 代碼實現原則
我們將基於如下思路來進行程序的整體架構和介面設計:
(1)合理使用面向對象特性,保證可測試性和模塊的獨立性。
(2)高重用,低耦合。
(3)結構合理,方法之間的調用深度不超過5層。
(4)命名規範合理,見名知意。
(5)不使用多態性,不過度使用面向對象設計設計原則。
(6)不使用太多內置API,盡量自主實現所有功能。
3. 定義代碼實現類
由上圖可知,該程序必須包含4個源代碼文件:
(1)MainRun:程序運行主入口,用於用戶輸入數據和調用CompareHandle.mainCompare(1,2).
(2)StringHandle:字元串處理類,用於輸入數據,解析字元串成數組,判斷是否為數值.
(3)CompareHandle:程序比較主類,用於比較數組中的值及判斷各種可能的情況.
(4)ArrayHandle:數組處理類,用於數組排序和數組值的比較.
4. 實現程序主入口:MainRun.java
package com.woniuxy.compare;public class MainRun {public static void main(String[] args) { StringHandle sh = new StringHandle(); CompareHandle ch = new CompareHandle(); // 提示用戶輸入字元串 Integer[] a = sh.inputString(); Integer[] b = sh.inputString(); // 對用戶輸入的內容進行比較 String result = ch.mainCompare(a, b); System.out.println(result); }}
5. 字元串處理類:StringHandle.java
package com.woniuxy.compare;import java.util.Arrays;import java.util.Scanner;import java.util.Vector;public class StringHandle{ // 從控制台輸入字元串 public Integer[] inputString() { Integer[] result; System.out.println("請輸入一個字元串:"); Scanner sc = new Scanner(System.in); String source = sc.nextLine(); if (source.length() < 1) { System.out.println("你的輸入不合法,將強制退出."); System.exit(1); result = null; } else { Integer[] array = this.splitString(source, ","); if (Arrays.equals(array, null)) System.out.println("輸入不合法"); result = array; } return result; } // 將字元串解析成數組 // 模擬實現字元串處理方法split,為方便測試,所以自行實現 public Integer[] splitString(String source, String delimiter) { Vector<Integer> vector = new Vector<Integer>(); int position = source.indexOf(delimiter); while (source.contains(delimiter)) { String value = source.substring(0, position); if (this.isNumber(value)) { vector.add(Integer.parseInt(value)); } else { System.out.println("你的輸入不合法,將強制退出."); System.exit(1); // 如果不想強制退出程序,也可以設置一個特別的值用以說明輸入不合法 // Integer[] result = {11111}; // return result; } source = source.substring(position + 1, source.length()); position = source.indexOf(delimiter); } vector.add(Integer.parseInt(source)); Integer[] array = new Integer[vector.size()]; vector.copyInto(array); return array; } // 檢查字元串是否可正常轉換為數字 public boolean isNumber(String source) { int minus = 0; // 統計負號的個數 int point = 0; // 統計小數點的個數 for(int i=0; i<source.length(); i++){ int code = source.charAt(i); // 獲取每個字元的ASCII碼 // 如果某個字元不屬於0-9或負號或小數點,則可以判定為無效數字 if (code<45 || code > 57 || code == 47) return false; // 統計字元串中負號和小數點的個數 if(code == 45) minus++; if(code == 46) point++; } // 如果字元串中的負號或小數點超過1個,則無效 if(minus > 1 || point > 1) return false; // 如果有負號,但是負號不在第一位,則無效 if(minus == 1 && source.charAt(0) != 45) return false; // 如果有小數點,但是小數點在最後一位,則無效 if(point == 1 && source.charAt(source.length()-1) == .) return false; // 如果以上情況都未出現,則說明是正確的數字 return true; }}
6. 數組比較類:CompareHandle.java
package com.woniuxy.compare;public class CompareHandle { // 輸入按一定規律分隔的字元串並將其轉換成數組 public String mainCompare(Integer[] a, Integer[] b) { String result = ""; int alength = a.length; int blength = b.length; if (alength == 0 || blength == 0) result = "結果: 數組長度為零."; else if (alength != blength) result = "結果: 數組長度不一致."; else { int compareResult = this.mainCheck(a, b); if (compareResult == 1) result = "結果: 數組相同."; else if (compareResult == 2) result = "結果: 數組排序後相同."; else result = "結果: 數組不同."; } return result; } // 比較兩個數組是否相同 public int mainCheck(Integer[] a, Integer[] b) { int flag = 0; ArrayHandle ah = new ArrayHandle(); if (ah.arrayCompare(a, b)) flag = 1; // 不用排序,自然相同 else { Integer[] arraya = ah.arraySort(a); Integer[] arrayb = ah.arraySort(b); if (ah.arrayCompare(arraya, arrayb)) flag = 2; // 排好序後相同 else flag = 3; // 排序後也不同 } return flag; }}
7. 數組處理類:ArrayHandle.java
package com.woniuxy.compare;public class ArrayHandle { // 對兩個數組進行排序(冒泡排序) public Integer[] arraySort(Integer[] array) { Integer i, j, temp, sorted; for(i=0; i<array.length-1; i++) { sorted = 0; for(j=0; j<array.length-i-1; j++) { if(array[j] > array[j+1]) { sorted = 1; temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } if (sorted == 0) break; } return array; } // 對兩個數組進行比較 public boolean arrayCompare(Integer[] a, Integer[] b) { int i; boolean flag = true; for (i=0; i<a.length; i++) { if (a[i] != b[i]) { flag = false; break; } } return flag; }}
8. 運行ArrayCompare
上述代碼的實現並非是最標準的代碼,也並非沒有Bug,當然,這也正好是留給大家去測試的點。由於我們需要模擬相對有多層次調用的特徵,筆者在設計代碼時特意將一些程序作了複雜化處理。請讀者朋友更多關注於程序的介面關係調用和接下來的代碼級測試實施上,而非代碼本身的實現邏輯。
當我們的代碼實現完成後,不妨直接運行MainRun類,看看能否得到本程序的運行結果。要完成接下來的測試開發工作,請首先保證整個程序代碼的完整性和正確性。
思考練習
(1)上述代碼是否存在明顯的BUG?有的話請修復。
(2)一個標準的軟體開發過程是怎樣的?試著總結一下。
注:希望學習更多技術,繼續在IT行業突破提升自己的各位朋友,歡迎加群594154674,不管你自我感覺牛不牛B。
推薦閱讀:
※Appium python自動化測試系列之移動自動化測試前提(一)
※Selenium自動化測試(二)alert及iframe的處理
※如何從手工測試轉變為自動測試?
※移動App端抓包工具Charles詳解
※移動App測試中的最佳做法