Equivalence Class Partitioning
一、等价类划分
所谓等价类是指输入域的某个互不相交的子集合,所有等价类的并集便是整个输入域。目的在于测试用例的无冗余性。
二、划分等价类( valid / invalid )
(1)有效等价类:检验程序是否实现了规格说明预先规定的功能和性能。
(2)无效等价类:检查软件功能和性能的实现是否有不符合规格说明要求的地方。
三、常用的等价类划分原则
(1)按区间划分
可以确定一个有效等价类、两个无效等价类。
(2)按数值划分
如果输入条件规定了输入数据的一组可能的值,而且程序是用不同的方式处理每一种值,则可为每一种值划分一个有效等价类,并划分一个无效等价类。
(3)按数值集合划分
规格说明中规定了输入值的集合,则可以确定一个有效等价类,并划分一个无效等价类。
(4)按限制条件或规则划分
规格说明中规定了输入数据必须遵守的规则和限制条件,则可以确立一个有效等价类(符合规则)和若干个(≥ 1)无效等价类(不同角度的违反规则)。
(5)细分等价类
如果我们确知,已划分的某等价类中的各元素(例子)在程序中的处理方式是不同的,则应据此将此等价类进一步划分成更小的等价类。
四、等价类测试用例设计
(1)在确立了等价类之后,可列出所有划分出的等价类表。
(2)为每一个等价类规定一个唯一的编号。
(3)设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类。重复这一步,直到测试用例覆盖了所有的有效等价类。
(4)设计一个新的测试用例,使其覆盖且只覆盖一个尚未覆盖的无效等价类。重复这一步,直到测试用例覆盖了所有的无效等价类。
五、等价类划分方法的应用
EditBox允许1到6个英文字符或数字,按OK结束
有效等价类:
长度:1到6 字符:a-z,A-Z,0-9
无效等价类:
长度:0,7 字符:英文/数字以外字符,控制字符,标点符号
编号 | 输入 | 输出 |
1 | abcdef | 符合要求 |
2 | abc123 | 符合要求 |
3 | 354301 | 符合要求 |
4 | 不符合要求 | |
5 | akdfnafks | 不符合要求 |
6 | ,.,.*& | 不符合要求 |
测试截图:
源代码:
1 import javafx.application.Application; 2 import javafx.event.ActionEvent; 3 import javafx.event.EventHandler; 4 import javafx.scene.Scene; 5 import javafx.scene.control.Button; 6 import javafx.scene.control.TextField; 7 import javafx.scene.layout.AnchorPane; 8 import javafx.scene.text.Text; 9 import javafx.stage.Stage; 10 11 12 public class Equivalence extends Application{ 13 14 public static void main(String arg0[]){ 15 Equivalence.launch(arg0); 16 } 17 18 @Override 19 public void start(Stage stage) throws Exception { 20 stage.setTitle("Equivalence class"); 21 AnchorPane root = new AnchorPane(); 22 23 Text message = new Text("请输入:"); 24 root.getChildren().add(message); 25 AnchorPane.setTopAnchor(message, 50.0); 26 AnchorPane.setLeftAnchor(message, 80.0); 27 28 final TextField textInput = new TextField(); 29 root.getChildren().add(textInput); 30 AnchorPane.setTopAnchor(textInput, 70.0); 31 AnchorPane.setLeftAnchor(textInput, 33.0); 32 33 Button submit = new Button(); 34 submit.setText("确定"); 35 root.getChildren().add(submit); 36 AnchorPane.setTopAnchor(submit, 100.0); 37 AnchorPane.setLeftAnchor(submit, 77.0); 38 39 submit.setOnAction(new EventHandler<ActionEvent>() { 40 public void handle(ActionEvent arg0) { 41 System.out.println(textInput.getText().toString().length()); 42 if(checkString(textInput.getText().toString())){ 43 Stage newStage = new Stage(); 44 AnchorPane newRoot = new AnchorPane(); 45 46 Text result = new Text("符合要求~"); 47 newRoot.getChildren().add(result); 48 AnchorPane.setTopAnchor(result, 20.0); 49 AnchorPane.setLeftAnchor(result, 30.0); 50 51 52 newStage.setScene(new Scene(newRoot, 50, 50)); 53 newStage.show(); 54 }else{ 55 Stage newStage = new Stage(); 56 AnchorPane newRoot = new AnchorPane(); 57 58 Text result = new Text("不符合要求~"); 59 newRoot.getChildren().add(result); 60 AnchorPane.setTopAnchor(result, 20.0); 61 AnchorPane.setLeftAnchor(result, 25.0); 62 63 64 newStage.setScene(new Scene(newRoot, 50, 50)); 65 newStage.show(); 66 } 67 68 } 69 }); 70 71 stage.setScene(new Scene(root, 200,200)); 72 stage.show(); 73 } 74 75 public boolean checkString(String str){ 76 if(str.length() == 0 || str.length() >= 7){ 77 return false; 78 } 79 80 char arr[] = new char[str.length()]; 81 arr = str.toCharArray(); 82 83 for(int i = 0; i < str.length(); i++){ 84 if((arr[i] >= 'a' && arr[i] <= 'z')||(arr[i] >= 'A' && arr[i] <= 'Z')||(arr[i] >= '0' && arr[i] <= '9')); 85 else{ 86 return false; 87 } 88 } 89 90 return true; 91 } 92 93 }