java自測
❶ java測試類
package com.test;
class Employee {
private int salary = 0;
public Employee() {
super();
}
public Employee(int salary) {
super();
this.salary = salary;
}
@Override
public String toString() {
return "Employee [salary=" + salary + "]";
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
class Manager extends Employee {
public Manager() {
super();
}
public Manager(int salary) {
super(salary);
}
}
/**
* 測試員工類
*
* @author 劉逸暉
*
*/
public class EmployeeTest {
public static void main(String[] args) {
Employee employee1 = new Employee(3000);
Manager manager1 = new Manager(6000);
System.out.println("Salary of Employee1 + salary of Manager1="
+ (employee1.getSalary() + manager1.getSalary()));
}
}
❷ JAVA程序測試
1、首先添加junit支持(這里假設你已經假如支持庫)。
其次,最好單獨創建test類文件夾
大致測試類這樣寫:
packagemyUtils
importstaticorg.junit.Assert.*;
importorg.junit.Test;
publicclassTranslatorTest{
/**
*這里測試你的translate方法
*/
@Test
publicvoidtestTranslate(Stringstr){
Translatormy=newTranslator("enToZh.txt");
StringtName=my.translate("sName");
System.out.println("tName:"+tName);
}
}
當然,Assert類提供了很多方便測試的靜態方法,推薦你使用提供的靜態方法進行測試。不過你這個例子不需要。@Test註解也是必須的,測試類和類最好在同一個包下,分開管理(一個放src目錄下,一個放test目錄下(這個目錄需要自己創建))
❸ JAVA單元測試
首先我們需要先下載相應的 JUnit 相關的 JAR 包,下載的過程可以去 JUnit 的官方網站,也可以直接通過 Maven 資源倉庫來完成。
使用簡單的 @Test 註解實現我們的測試方法的編寫和執行
准備工作做好之後,接下來我們就可以開始嘗試編寫壹個簡單的測試代碼了。首先,我們編寫了壹個 Calculator 類,並提供五個方法分別完成加減乘除以及求平方的運算。代碼如下:
package net.oschina.rrfhoinn.main;
public class Calculator {
public void add(int n){
result += n;
}
public void substract(int n){
result -= n;
}
public void multiply(int n){
result *= n;
}
public void divide(int n){
result /= n;
}
public void square(int n){
result = n * n;
}
public int getReuslt(){
return result;
}
public void clear(){
result = 0;
}
private static int result;
}
在測試類中用到了JUnit4框架,自然要把相應地Package包含進來。最主要地一個Package就是org.junit.*。把它包含進來之後,絕大部分功能就有了。還有一句話也非常地重要「import static org.junit.Assert.*;」,我們在測試的時候使用的壹系列assertEquals()方法就來自這個包。大家注意壹下,這是壹個靜態包含(static),是JDK5中新增添的壹個功能。也就是說,assertEquals是Assert類中的壹系列的靜態方法,壹般的使用方式是Assert. assertEquals(),但是使用了靜態包含後,前面的類名就可以省略了,使用起來更加的方便。
另外要注意的是,我們的測試類是壹個獨立的類,沒有任何父類。測試類的名字也可以任意命名,沒有任何局限性。所以我們不能通過類的聲明來判斷它是不是一個測試類,它與普通類的區別在於它內部的方法的聲明,我們接著會講到。在測試類中,並不是每壹個方法都是用於測試的,所以我們必須使用「註解」來明確表明哪些是測試方法。「註解」也是JDK5的壹個新特性,用在此處非常恰當。我們可以看到,在某些方法的前有@Before、@Test、@Ignore等字樣,這些就是註解,以壹個「@」作為開頭。這些註解都是JUnit4自定義的,熟練掌握這些註解的含義,對於編寫恰當的測試類非常重要。
接下來我們創建壹個測試類 CalculatorTest.java,代碼如下:
package net.oschina.rrfhoinn.test;
import static org.junit.Assert.*;
import org.junit.Test;
import net.oschina.rrfhoinn.main.Calculator;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Test
public void testAdd(){
calculator.add(7);
calculator.add(8);
assertEquals(15, calculator.getReuslt());
}
}
首先,我們要在方法的前面使用@Test標注,以表明這是壹個測試方法。對於方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須為void,而且不能有任何參數。如果違反這些規定,會在運行時拋出壹個異常。至於方法內該寫些什麼,那就要看你需要測試些什麼了。比如上述代碼中,我們想測試壹下add()方法的功能是否正確,就在測試方法中調用幾次add函數,初始值為0,先加7,再加8,我們期待的結果應該是15。如果最終實際結果也是15,則說明add()方法是正確的,反之說明它是錯的。assertEquals(15, calculator.getResult());就是用來判斷期待結果和實際結果是否相等,其中第壹個參數填寫期待結果,第二個參數填寫實際結果,也就是通過計算得到的結果。這樣寫好之後,JUnit 會自動進行測試並把測試結果反饋給用戶。
如果想運行它,可以在 eclipse 的資源管理器中選擇該類文件,然後點擊右鍵,選擇 Run As->JUnit Test 即可看到運行結果。
使用@Test 的屬性 Ignore 指定測試時跳過這個方法
如果在寫程序前做了很好的規劃,那麼哪些方法是什麼功能都應該實現並且確定下來。因此,即使該方法尚未完成,他的具體功能也是確定的,這也就意味著你可以為他編寫測試用例。但是,如果你已經把該方法的測試用例寫完,但該方法尚未完成,那麼測試的時候無疑是「失敗」。這種失敗和真正的失敗是有區別的,因此 JUnit 提供了壹種方法來區別他們,那就是在這種測試函數的前面加上 @Ignore 標注,這個標注的含義就是「某些方法尚未完成,暫不參與此次測試」。這樣的話測試結果就會提示你有幾個測試被忽略,而不是失敗。壹旦你完成了相應函數,只需要把@Ignore標注刪去,就可以進行正常的測試。
比如說上面的測試類 Calculator.java 中,假設我們的 Calculator 類的 multiply() 方法沒有實現,我們可以在測試類 CalculatorTest 中先寫如下測試代碼:
package net.oschina.rrfhoinn.test;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.Test;
import net.oschina.rrfhoinn.main.Calculator;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
... //此處代碼省略
@Ignore("method square() not implemented, please test this later...")
@Test
public void testSquare(){
calculator.square(3);
assertEquals(9, calculator.getReuslt());
}
}
我們再運行壹次測試,會看到如下結果,從圖中可以很明顯的看出,方法testSquare() 上的 @Ignore 註解已經生效了,運行時直接跳過了它,而方法testAdd()仍然正常的運行並通過了測試。
使用註解 @Before 和 @After 來完成前置工作和後置工作
前置工作通常是指我們的測試方法在運行之前需要做的壹些准備工作,如資料庫的連接、文件的載入、輸入數據的准備等需要在運行測試方法之前做的事情,都屬於前置工作;類似的,後置工作則是指測試方法在運行之後的壹些要做的事情,如釋放資料庫連接、輸入輸出流的關閉等;比如我們上面的測試,由於只聲明了壹個 Calculator 對象,他的初始值是0,但是測試完加法操作後,他的值就不是0了;接下來測試減法操作,就必然要考慮上次加法操作的結果。這絕對是壹個很糟糕的設計!我們非常希望每壹個測試方法都是獨立的,相互之間沒有任何耦合度。因此,我們就很有必要在執行每壹個測試方法之前,對Calculator對象進行壹個「復原」操作,以消除其他測試造成的影響。因此,「在任何壹個測試方法執行之前必須執行的代碼」就是壹個前置工作,我們用註解 @Before 來標注它,如下例子所示:
package net.oschina.rrfhoinn.test;
...
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
...//這里省略部分代碼
@Before
public void setUp() throws Exception {
calculator.clear();
}
@After
public void tearDown() throws Exception {
System.out.println("will do sth here...");
}
...//這里省略部分代碼
}
另外要說的是,註解 @Before 是定義在 org.junit.Before 這個類中的,因此使用時需要將其引入我們的代碼中。這樣做了之後,每次我們運行測試方法時,JUnit 都會先運行 setUp() 方法將 result 的值清零。不過要注意的是,這里不再需要 @Test 註解,因為這並不是壹個 test,只是壹個前置工作。同理,如果「在任何測試執行之後需要進行的收尾工作,我們應該使用 @After 來標注,方法與它類似。由於本例比較簡單,不需要用到此功能,所以我們只是簡單了給它添加了壹個 tearDown() 方法並在收尾時列印壹句話到控制台,並且使用 @After 來註解這個方法。
使用@BeforeClass 和 @AfterClass 來完成只需要執行壹次的前置工作和後置工作
上面我們提到了兩個註解 @Before 和 @After ,我們來看看他們是否適合完成如下功能:有壹個類負責對大文件(超過500 MB)進行讀寫,他的每壹個方法都是對文件進行操作。換句話說,在調用每壹個方法之前,我們都要打開壹個大文件並讀入文件內容,這絕對是壹個非常耗費時的操作。如果我們使用 @Before 和 @After ,那麼每次測試都要讀取壹次文件,效率及其低下。所以我們希望的是,在所有測試壹開始讀壹次文件,所有測試結束之後釋放文件,而不是每次測試都讀文件。JUnit的作者顯然也考慮到了這個問題,它給出了@BeforeClass 和 @AfterClass 兩個註解來幫我們實現這個功能。從名字上就可以看出,用這兩個註解標注的函數,只在測試用例初始化時執行 @BeforeClass 方法,當所有測試執行完畢之後,執行 @AfterClass 進行收尾工作。在這里要注意壹下,每個測試類只能有壹個方法被標注為 @BeforeClass 或 @AfterClass,而且該方法必須是 public static 類型的。
使用@Test 的屬性 timeout 來完成限時測試,以檢測代碼中的死循環
現在假設我們的 Calculator 類中的 square() 方法是個死循環,那應該怎麼辦呢,比如說像下面這樣:
public void square(int n){
for(;;){}
}
如果測試的時候遇到死循環,你的臉上絕對不會露出笑容的。因此,對於那些邏輯很復雜,循環嵌套比較深的、有可能出現死循環的程序,因此壹定要採取壹些預防措施。限時測試是壹個很好的解決方案。我們給這些測試函數設定壹個預期的執行時間,超過了這壹時間,他們就會被系統強行終止,並且系統還會向你匯報該函數結束的原因是因為超時,這樣你就可以發現這些 Bug 了。要實現這壹功能,只需要給 @Test 標注加壹個參數timeout即可,代碼如下:
@Test(timeout=2000L)
public void testSquare() {
calculator.square(3);
assertEquals(9, calculator.getReuslt());
}
timeout參數表明了你預計該方法運行的時長,單位為毫秒,因此2000就代表2秒。現在我們讓這個測試方法運行壹下,看看失敗時是什麼效果。
使用@Test 的屬性expected來監控測試方法中可能會拋出的某些異常
JAVA中的異常處理也是壹個重點,因此你經常會編寫壹些需要拋出異常的函數。如果你覺得壹個函數應該拋出異常,但是它沒拋出,這算不算 Bug 呢?這當然是Bug,JUnit 也考慮到了這壹點,並且可以幫助我們找到這種 Bug。例如,我們寫的計算器類有除法功能,如果除數是壹個0,那麼必然要拋出「除0異常」。因此,我們很有必要對這些進行測試。代碼如下:
@Test(expected=java.lang.ArithmeticException.class)
public void testDivide(){
calculator.divide(0);
}
如上述代碼所示,我們需要使用@Test註解中的expected屬性,將我們要檢驗的異常(這里是 java.lang.ArithmeticException)傳遞給他,這樣 JUnit 框架就能自動幫我們檢測是否拋出了我們指定的異常。
指定 JUnit 運行測試用例時的 Runner
大家有沒有想過這個問題,當你把測試代碼提交給JUnit框架後,框架是如何來運行你的代碼的呢?答案就是Runner。在JUnit中有很多個Runner,他們負責調用你的測試代碼,每壹個Runner都有其各自的特殊功能,你要根據需要選擇不同的Runner來運行你的測試代碼。可能你會覺得奇怪,前面我們寫了那麼多測試,並沒有明確指定壹個Runner啊?這是因為JUnit中有壹個默認的Runner,如果你沒有指定,那麼系統會自動使用默認Runner來運行你的代碼。換句話說,下面兩段代碼含義是完全壹樣的:
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class CalculatorTest {
...//省略此處代碼
}
//用了系統默認的JUnit4.class,運行效果完全壹樣
public class CalculatorTest {
...//省略此處代碼
}
❹ 用java實現小學生算術自測系統
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUMBER 10/*定義數組項目的個數為一個符號常量*/
int Num1[10]= {0},Num2[10]= {0},Pos1=0,Pos2=0;
/*定義兩個數組來保存已經出現的情況*/
int main()
{
int putquestion();/*聲明出題函數*/
int questionnum=10;/*聲明變數*/
int i=1;
printf("Please input number of question:");
scanf("%d",&questionnum);
int answer[NUMBER];/*聲明一個數組,用於儲存學生的答案*/
int rightanswer[NUMBER];/*聲明一個數組,用於儲存正確答案*/
for(i=1; i<=questionnum; i++)
{
rightanswer[i-1]=putquestion();
scanf("%d",&answer[i-1]);
}
for(i=1; i<=NUMBER; i++)
printf("\n%d%5d",answer[i-1],rightanswer[i-1]);
}
bool exist(int goal,int *Num)
{/*檢查數字goal是否已經出現在Num數組裡面*/
int i;
for(i=0; i<Pos1; i++)
if(goal==Num[i])
return true;
return false;
}
int putquestion()/*此函數用於出題*/
{
int randValue;
int num1;
int num2;
int correctanswer;
srand((int)time(NULL));
randValue=1+rand()%4;
num1=1+rand()%99;
num2=1+rand()%99;
switch(randValue)
{
case 1:/*加法作業*/
while(num1+num2>=100||exist(num1,Num1)&&exist(num2,Num2))
{/*當滿足該條件(滿足題目要求且兩個數同時出現過)時繼續循環*/
num1=1+rand()%99;
num2=1+rand()%99;
}
Num1[Pos1++]=num1;
Num2[Pos2++]=num2;
printf("\n%d+%d=",num1,num2);
correctanswer=num1+num2;
break;
case 2:/*減法作業*/
while(num1-num2<0||exist(num1,Num1)&&exist(num2,Num2))
{
num1=1+rand()%99;
num2=1+rand()%99;
}
Num1[Pos1++]=num1;
Num2[Pos2++]=num2;
printf("\n%d-%d=",num1,num2);
correctanswer=num1-num2;
break;
case 3:/*乘法作業*/
while(num1*num2>=100||exist(num1,Num1)&&exist(num2,Num2))
{
num1=1+rand()%99;
num2=1+rand()%99;
}
Num1[Pos1++]=num1;
Num2[Pos2++]=num2;
printf("\n%d*%d=",num1,num2);
correctanswer=num1*num2;
break;
case 4:/*除法作業*/
while(num1%num2!=0||exist(num1,Num1)&&exist(num2,Num2))
{
num1=1+rand()%99;
num2=1+rand()%99;
}
Num1[Pos1++]=num1;
Num2[Pos2++]=num2;
printf("\n%d/%d=",num1,num2);
correctanswer=num1/num2;
break;
}
return(correctanswer);
}
❺ java 單元測試。是什麼
你的理解是正確的。 通常針對一個方法會寫幾組這樣的 帶入值,復雜內的方法可能更多。實容際使用當中,一個方法的運行會有很多依賴關系 ,不如 需要上下文環境,需要 HTTP Requst ,Response ,資料庫連接等。 如果自己寫的話太復雜,所以就有 很多插件來幫忙解決外部問題。
Junit 是JAVA單元測試使用最多的插件。其他的也還有很多,基本和 Junit的思想是一樣的。
❻ Java測試
無聊幫你寫寫吧,你可以參考一下:
//Date類
package com.etmp.test;
public class Date {
private int year;
private int month;
private int date;
//無參構造方法
public Date() {
super();
// TODO Auto-generated constructor stub
}
//帶參構造方法
public Date(int year, int month, int date) {
super();
this.year = year;
this.month = month;
this.date = date;
}
//重寫toString
//getter,setter
public int getYear() {
return year;
}
@Override
public String toString() {
return "date=" + date + ", month=" + month + ", year=" + year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
}
//Person類
public class Person {
private String name;
private Date birth;//引用上面自己定義的Date類型
public Person(String name, Date birth) {
super();
this.name = name;
this.birth = birth;
}
@Override
public String toString() {
return "birth=" + birth + ", name=" + name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
//Student類繼承Person,同時繼承Person擁有的屬性
class Student extends Person{
private int score;
public Student(String name, Date birth) {
super(name, birth);
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "score=" + score;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
面向對象好好學,打基礎很重要!
希望我的回答,對你有幫助……
❼ java測試類
測試類是用來測試你完成的其他類的功能點是否正確,本題測試類大體長這個樣子:
public class EmpTest
{
public static void main(String []args) {
Employee e1 = new Employee(實際參數列表);
Employee m1 = new Manager(實際參數列表);
e1.calcSalary();
m1.calcSalary();
System.out.println("員工 e1的工資是:" + e1.getSalary() );
System.out.println("經理 m1的工資是:" + m1.getSalary() );
}
}
❽ java怎麼測試用什麼測試
JAVA程序還是代碼? netbeans 是個不錯的選擇!
❾ java測試是什麼
測試在正確的數據下會不會產生錯誤的結果,在錯誤的數據下會不會給出正確的提示,會不會崩潰等等,總之就是測試你寫的代碼有沒有問題。
比如你寫了加法,就測試你加法能不能正確的得到結果,輸入錯誤的字元會不會導致程序崩潰之類的