1 实验
刚学了下利用进行Junit的单元测试,现在来记录下。
JUnit是一个开源的Java编程语言的单元测试框架,应用Junit可以快速高效的对代码进行测试。
现在主要利用JUnit测试如下代码,代码比较简单就不注释了,可以看出代码主要分为两个类BankAccount 和BankAccountGold
1 public class BankAccount
2 {
3 String AccountNumber;
4 String AccountName;
5 String ID;
6 String Password;
7 double TotalMoney;
8
9 public BankAccount(String AccountNumber, String AccountName, String ID, String Password)
10 {
11 this.AccountNumber = AccountNumber;
12 this.AccountName = AccountName;
13 this.ID = ID;
14 this.Password = Password;
15 }
16
17 public void Balance(String AccountNumber)
18 {
19 System.out.println("PLEASE FIND YOUR BALANCE INFORMATION");
20 System.out.println("Account name:" + AccountName);
21 System.out.println("Account number:" + AccountNumber);
22 System.out.println("Your balance:" + TotalMoney);
23 }
24
25 public void Deposit(double AddMoney)
26 {
27 try
28 {
29 if(AddMoney < 0) throw new RuntimeException();
30 this.TotalMoney += AddMoney;
31 }
32 catch(RuntimeException except)
33 {
34 System.out.println("Failed to deposite, money should be larger than 0");
35 }
36 System.out.println("Deposited money succeeded, the total money is:" + TotalMoney);
37 }
38
39 public void Withdraw(double GetMoney)
40 {
41 try
42 {
43 if(GetMoney > this.TotalMoney ) throw new RuntimeException();
44 this.TotalMoney -= GetMoney;
45 System.out.println("You have withdrawed money:" + GetMoney);
46 }
47 catch (RuntimeException except)
48 {
49 System.out.println("Error! you don't have enough balance");
50 }
51 }
52 }
53
54 class BankAccountGold extends BankAccount
55 {
56 public BankAccountGold(String AccountNumber, String AccountName, String ID, String Password)
57 {
58 super(AccountNumber,AccountName,ID,Password);
59 }
60 public void Withdraw(double GetMoney, double overdraft)
61 {
62 overdraft = this.TotalMoney - GetMoney;
63 if(overdraft > 0)
64 {
65 this.TotalMoney = overdraft;
66 System.out.println("Succeeded to withdraw. your balance is" + this.TotalMoney);
67 }
68 else if((overdraft < 0)&&(overdraft > -1000))
69 {
70 this.TotalMoney = overdraft + overdraft * 0.05; // The interest is 5% of the overdraft
71 System.out.println("Succeeded to withdraw. your balance is" + this.TotalMoney);
72 }
73 else
74 {
75 System.out.println("Failed to withdraw, you can not overdraft more than 1000!");
76 }
77 }
78 }
利用Junit写出的测试代码如下
1 import static org.junit.Assert.*;
2
3 import org.junit.AfterClass;
4 import org.junit.Test;
5
6 public class BankAccountTest {
7
8 @AfterClass
9 public static void tearDownAfterClass() throws Exception {
10 }
11
12 @Test
13 public void BankAccount()
14 {
15 String AccountNumberTest = new String("1");
16 String AccountNameTest = new String("Q");
17 String IDTest = new String("QID");
18 String PasswordTest = new String("123");
19 BankAccount s = new BankAccount(AccountNumberTest, AccountNameTest, IDTest, PasswordTest);
20 assertEquals(AccountNumberTest, s.AccountNumber);
21 assertEquals(AccountNameTest, s.AccountName);
22 assertEquals(IDTest, s.ID);
23 assertEquals(PasswordTest, s.Password);
24 }
25
26 @Test
27 public void Balance()
28 {
29 BankAccount s = new BankAccount("1", "Q", "QID", "123");
30
31 s.Balance(s.AccountNumber);
32 }
33
34 @Test
35 public void ExceptionDeposit()
36 {
37 BankAccount s = new BankAccount("1", "Q", "QID", "123");
38 s.Deposit(-10);
39 }
40
41 @Test
42 public void Deposit()
43 {
44 BankAccount s = new BankAccount("1", "Q", "QID", "123");
45 s.Deposit(10);
46 }
47
48 @Test
49 public void ExceptionWithDraw()
50 {
51 BankAccount s = new BankAccount("1", "Q", "QID", "123");
52 s.TotalMoney = 10;
53 s.Withdraw(100);
54 }
55
56 @Test
57 public void WithDraw()
58 {
59 BankAccount s = new BankAccount("1", "Q", "QID", "123");
60 s.TotalMoney = 100;
61 s.Withdraw(10);
62 }
63 }
64
65 import static org.junit.Assert.*;
66
67 import org.junit.AfterClass;
68 import org.junit.Test;
69
70 public class BankAccountGoldTest {
71
72 @AfterClass
73 public static void tearDownAfterClass() throws Exception {
74 }
75
76 @Test
77 public void BankAccountGold()
78 {
79 String AccountNumberTest = new String("1");
80 String AccountNameTest = new String("Q");
81 String IDTest = new String("QID");
82 String PasswordTest = new String("123");
83
84 BankAccountGold s= new BankAccountGold(AccountNumberTest, AccountNameTest, IDTest, PasswordTest);
85 assertEquals(AccountNumberTest, s.AccountNumber);
86 assertEquals(AccountNameTest, s.AccountName);
87 assertEquals(IDTest, s.ID);
88 assertEquals(PasswordTest, s.Password);
89 }
90
91 @Test
92 public void WithDraw()
93 {
94 BankAccountGold s = new BankAccountGold("1", "Q", "QID", "123");
95 s.TotalMoney = 100;
96 s.Withdraw(10.0);
97 s.TotalMoney = 100;
98 s.Withdraw(150, 0);
99 s.TotalMoney = 100;
100 s.Withdraw(2000, 0);
101 }
102 }
测试结果如下:
2 总结&问题
这是我第一次接触自动的单元测试的框架,感觉还是很新奇。Junit在我看来本质就是利用一些assert等的辅助语句实现对软件自动化测试的工具。刚开始还以为测试用例都可以自己生成,接触后才发现还是无法达到这么智能,需要自己进行书写测试用例,只不过把一些之前可能要利用print才能看出结果的语句,利用自动化的图表统计出来。这个实验由于java和Junit都不熟,有个问题在这里记录下,希望之后可以解决。
在待测试代码中存在try catch语句时,如何测试代码进入到catch中。这里并不能直接利用Junit4中的expected来检测待测试进入异常。上述实验中是通过观看输出来判定是否到达这个分支,并不能实现自动测试。