KiemThuChuongTrinhVoiJUnit

download KiemThuChuongTrinhVoiJUnit

of 10

Transcript of KiemThuChuongTrinhVoiJUnit

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    1/10

    KIM THCHNG TRNH VI JUNITTESTING WITH JUNIT

    Nguyn Cng V, Phmi XunKhoa Cng ngh thng tin,i hc Nng Lm TP.HCM

    Email: [email protected] hoc [email protected]

    SUMMARY

    In software development, maintaining and testing are considered as boring tasks when

    comparing to programming. Software people are more excited to new and innovative

    things than to those that are already well known to them. However, the more software

    are produced, the more bugs we observe. Testing is an indispensable activity in

    software development for bug detection and quality assurance. This writing

    introduces the use an open source tool known as JUnit to facilitate the unit testing

    activity. Recognizing the importance of this tool, many integrated development

    environments (IDEs), such as JBuilder, have integrated JUnit to their architecture.

    T VN

    Trong chuyn cng tc ti i hc Calgary Canada vo cui nm 2003, chng tinhn thy nhiu mn hc lin quan n cng ngh phn mm, bc i hc ln caohc, nhn mnh n cng on kim th chng trnh. Mi chng trnh u phii km vi b s liu kim th. Tuy nhin, hot ng ny cha thc s ph bin trongchng trnh ging dy lp trnh v cng ngh phn mm ti mt s trng i hc nc ta. Ngi lp trnh thng xem nh vic kim th, n gin v l mt cngvic nhm chn, t gy hng th. Nhng kim th l mt hot ng quan trng vkhng th thiu c nhm pht hin li trong chng trnh, t nng cao nng sutv m bo cht lng sn phm phn mm. Beck v Gamma l nhng ngi u tin

    pht trin cng c m ngun mJUnit h trvic kim th. Bi vit ny s trnhby li mt v d minh ha vic p dng JUnit bng vic a ra mt thit kn ginv hp l gii quyt bi ton t ra.

    LI CH CA JUNIT

    JUnit trnh cho ngi lp trnh phi lm i lm li nhng vic kim th nhm chnbng cch tch bit m kim th ra khi m chng trnh, ng thi tng ha vict chc v thi hnh cc b s liu kim th.

    Thot tin, khi s dng JUnit, ta c th c cm gic l JUnit ch lm mt thm thigian cho vic kim th: Thay v phi vit thm cc lp v phng thc mi phc vcho cng tc kim th, ta c th son nhanh mt b s liu ri vit ngay vo trong

    phng thc main() v quan st ngay kt qu kim th. V qu trnh son s liu vqu trnh kim th din ra ng thi, nn ta s d dng nhn bit c ngay chngtrnh chy ng trn b s liu kim th hay khng, m khng cn nhn vo tnhiu xanh m JUnit c th h tr.

    Nhng khi t chc li chng trnh cho hp l hn (refactoring) hoc khi phi thayi chng trnh phc v cho nhu cu mi, cc b s liu kim th trc y scn c s dng li chc chn rng nhng thay i trong chng trnh khng lm

    phng hi n nhng thnh qu trc , lc ny ta s phi mt thi gian tm hiu

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    2/10

    li xem b s liu trc y s tng ng vi kt xut g v ta khng th nhht mihot ng kim th din ra. Vic nhli nhng kim th qua s chng th v vkhng em n cho ta iu g mi. Nu phi kim th trn nhng b s liu ln thgnh nng ca vic t chc kim th s chng cht thm. JUnit gip ngi lp trnhtng ha cc cng vic nhm chn, v ch cn nhn thy tn hiu xanh l ta c thyn tm. Ph lc A s hng dn vic tch hp JUnit vo mi trng Eclipse.

    V D MINH HA

    Sau y l mt v d minh ha vi nhng yu cu mi dn dn c thm vo: Hythit k l p tin t. Tin tc c trng bng s tin v n v tin (chng hnVND hoc USD). Trc yu cu ny, ta d dng vit ra lp MoneyHnh 1.

    publicclass Money {privatedouble amount;private String currency;

    public Money(double amount, String currency) {

    this.amount = amount;this.currency = currency;}

    }

    Hnh 1.Lp Moneydngbiu din mt loi tin t

    By gigi s rng ta ch cn x l mt loi tin t duy nht, chng hn tin VitNam. Hy hin thc phng thc di y cng hai s tin cng loi vi nhau, vdng JUnit kim th chng trnh.

    Money add(Money money)

    Hnh 2 s trnh by phn hiu chnh lp Money nhm gii quyt yu cu mi va t

    ra.

    publicclass Money {// Phn tng t nh trong Hnh 1 c lc bt

    public Money add(Money money) {returnnew Money(this.amount + money.amount, this.currency);

    }}

    import junit.framework.Assert;import junit.framework.TestCase;

    publicclass MoneyTest extends TestCase {publicvoid testAdd() {

    Money m1 = new Money(200, "VND");Money m2 = new Money(1000, "VND");Money result = m1.add(m2); // i tng lu kt qu tnh tonMoney expected = new Money(1200, "VND"); // kt qu d kinAssert.assertTrue(result.equals(expected)); // lnh kim th

    }}

    Hnh 2.Phng thc add()c bsung vo lp Money

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    3/10

    Phn kim th c bn im ng ch sau:1. Phng thc kim th cn c t tn bt u bng ttest2. i tng lu kt qu tnh ton,3. i tng lu kt qu d kin, v4. Kim chng s trng khp gia kt qu tnh ton v kt qu d kin.

    y ta dng lnh assertTrue() v phng thc equals() v kt qu v d kin lhai i tng. Nu kt qu v d kin thuc kiu d liu nguyn thy, chng hn int,th ta c th dng mt trong hai lnh sau:

    Assert.assertTrue(result == expected);Assert.assertEquals(result, expected);

    Lnh kim chng th hai s cung cp nhiu thng tin hn nu kt qu tnh ton v dkin khng trng khp nhau, t gip ngi lp trnh nhanh chng pht hin l dogy ra li bn trong chng trnh. (Thi hnh vic kim th JUnit trong mi trngEclipse: Chn lp kim th Kch vo menu RunRun AsJUnit Test. C thcn click vo th JUnit pha di bn tri mn hnh thy c tn hiu xanh

    hoc )

    Sau khi thi hnh JUnit Test, ta s gp tn hiu (Hnh 3), ngha l chng trnh c li. c c tn hiu xanh, ta cn nh ngha li (override) phng thcequals() bn trong lp Money so snh bng gia hai i tng (Hnh 4).

    Hnh 3.Kt qu kim thkhi thi hnh lp MoneyTestHnh 2

    publicclass Money {// Phn tng t nh trong Hnh 2 c lc bt

    publicboolean equals(Object object) {if (object instanceof Money) {

    Money money = (Money)object;returnthis.amount == money.amount &&

    this.currency == money.currency;}returnfalse;

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    4/10

    }}

    Hnh 4.nh ngha li phng thc equals() trong lp Money

    Ta cng cn vit m kim th tnh ng n ca phng thc equals() (Hnh 5).Sau khi thi hnh JUnit Test, ta sc tn hiu xanh (Hnh 6). iu cn lu l

    phng thc equals()Hnh 4 khng tht s an ton nu s tin c phn thp phn,nhng chi tit t nh ny c c b qua n gin ha vn ang cp.

    publicclass MoneyTest extends TestCase {publicvoid testAdd() {

    Money m1 = new Money(200, "VND");Money m2 = new Money(1000, "VND");Money result = m1.add(m2);Money expected = new Money(1200, "VND");Assert.assertTrue(result.equals(expected));

    }

    publicvoid testEquals() {

    Money m1 = new Money(200, "VND");Money m2 = new Money(1000, "VND");Assert.assertTrue(m1.equals(new Money(200, "VND")));Assert.assertFalse(m1.equals(m2));

    }}

    Hnh 5. M kim thsau khi nh ngha li phng thc equals()

    Hnh 6.Kt qu kim thsau khi nh ngha li phng thc equals()

    Quan st m kim thHnh 5, ta thy cn phi t chc li v c s trng lp m. loi b s trng lp m ny, ta c th chuyn hai i tng cc bm1 v m2 thnhhai thuc tnh ring t. (Chuyn bin cc b thnh thuc tnh lp trong mi trngEclipse: Kch vo bin cc b cn chuyn menu Refactor Convert LocalVariable to FieldInitialize in: Field declaration)

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    5/10

    By gigi s rng ta li c thm mt yu cu mi: Cc n v kinh doanh c th ginhiu hn mt loi tin, chng hn va c VND va c USD. Khi thm mt loi tinkhc vi loi tin hin c th chng trnh khng c cng vo s tin hin c m

    phi lu tr ring loi tin mi ny. V d, nu hin thi ta c 1200 VND, th sau khithm 10 USD, ta s c 1200 VND v 10 USD. Hy thit k chng trnh thc hinyu cu trn.

    hon thnh yu cu, ta s thit k thm mt lp mi c tn l MoneyBag lu trmt danh sch cc loi tin khc nhau, v vit thm mt lp kim th mi (Hnh 7).

    import java.util.ArrayList;import java.util.Iterator;import java.util.List;

    publicclass MoneyBag {private List monies = new ArrayList();

    public String toString() {String s = "{ ";Iterator iter = monies.iterator();while (iter.hasNext())

    s += iter.next() + " ";return s + "}";

    }

    publicvoid add(Money money) {for (int i = 0; i < monies.size(); i++) {

    Money m = (Money)monies.get(i);if (money.getCurrency().equals(m.getCurrency())) {

    monies.set(i, m.add(money));return;

    }}// money is a new currencymonies.add(money);

    }}

    import junit.framework.Assert;import junit.framework.TestCase;

    publicclass MoneyBagTest extends TestCase {publicvoid testAddWithToString() {

    MoneyBag bag = new MoneyBag();

    Assert.assertEquals(bag.toString(), "{ }");

    bag.add(new Money(1200, "VND"));Assert.assertEquals(bag.toString(), "{ [1200 VND] }");

    bag.add(new Money(10, "USD"));Assert.assertEquals(bag.toString(), "{ [1200 VND] [10 USD] }");

    }}

    Hnh 7.Lp MoneyBagv m kim th

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    6/10

    Khi thi hnh JUnit Test, ta s g p tn hiu . Bng vic chn lnhSystem.out.println() vo phng thc testAddWithToString(), ta s pht hin ra ktqu phi l { [1200.0 VND] }, thay v { [1200 VND] }. T ta bit rng cn phi hiuchnh kt quc tn hiu xanh. iu ny mt ln na cho thy im t nh khi

    phi thc hin vic so snh trn cc s thc.

    Sau y l cu hi dnh cho bn c trc khi chng ti trnh by tip: Ti sao khngvit phng thc equals() trong lp MoneyBag v s dng n trong JUnit Test?

    Ngoi vic dng phng thc toString() kim th, ta cn c th vit phng thcequals() v mt phng thc b tr, c t tn l contains(), kim tra xem itng MoneyBag c cha mt i tng Money cho trc khng (Hnh 8).

    V MoneyBag ch cha cc i tng Money phn bit, nn khi xt tnh bng nhaugia hai i tng MoneyBag trong phng thc equals(), ta ch cn kim chng itng ny c phi l tp con ca i tng kia v s phn t ca hai i tng cn

    bng nhau l . Vic kim th tnh ng n ca cc phng thc equals()c thhin trong phng thc testEquals() (Hnh 9). Ngoi ra, v thuc tnh ca phngthc b tr contains() l private nn ta khng th kim th ring phng thc nytrong lp MoneyBagTest, m chuyn vo phng thc main() ca lp MoneyBag.

    publicclass MoneyBag {// Phn tng t nh trong Hnh 7 c lc bt

    privateboolean contains(Money money) {Iterator iter = monies.iterator();while (iter.hasNext()) {

    if (money.equals((Money)iter.next()))returntrue;

    }returnfalse;}

    publicboolean equals(Object object) {if (object instanceof MoneyBag) {

    MoneyBag bag = (MoneyBag)object;if (monies.size() != bag.monies.size())

    returnfalse;Iterator iter = bag.monies.iterator();while (iter.hasNext()) {

    Money m = (Money)iter.next();if (!monies.contains(m))

    returnfalse;}returntrue;

    }returnfalse;

    }

    publicstaticvoid main(String[] args) {MoneyBag bag = new MoneyBag();Money m1 = new Money(1200, "VND");

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    7/10

    Money m2 = new Money(10, "USD");

    System.out.println(!bag.contains(m1));

    bag.add(m1);System.out.println(bag.contains(m1));System.out.println(!bag.contains(m2));

    bag.add(m2);System.out.println(bag.contains(m2));

    }}

    Hnh 8.Bsung vo MoneyBaghai phng thc contains() v equals()publicclass MoneyBagTest extends TestCase {

    publicvoid testAddWithToString() {// Phn tng t nh trong Hnh 7 c lc bt

    }

    publicvoid testAddWithEquals() {MoneyBag bag1 = new MoneyBag();MoneyBag bag2 = new MoneyBag();Assert.assertTrue(bag1.equals(bag2));

    bag1.add(new Money(1200, "VND"));Assert.assertFalse(bag1.equals(bag2));

    bag1.add(new Money(10, "USD"));

    bag2.add(new Money(10, "USD"));bag2.add(new Money(1200, "VND"));Assert.assertTrue(bag1.equals(bag2));

    }}

    Hnh 9.Bsung phng thc testAddWithEquals() vo lp kim th

    kt hp ng thi nhiu lp lp kim th khc nhau, ta c th vit ra mt b kimth (TestSuit) nhc minh ha Hnh 10. (Trong mi trng Eclipse: Kch vomenu FileNewOther JavaJUnitTestSuitNextFinish)

    import junit.framework.Test;import junit.framework.TestSuite;

    publicclass AllTests {

    publicstatic Test suite() {TestSuite suite = new TestSuite(Test for Money);suite.addTest(new TestSuite(MoneyTest.class));suite.addTest(new TestSuite(MoneyBagTest.class));return suite;

    }}

    Hnh 10.Kim thnhiu b sliu ng thi

    Sau y l vi bi tp dnh cho bn c:

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    8/10

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    9/10

    PH LC: TCH HP JUNIT VO MI TRNG ECLIPSE

    1. Ti phn mm JUnit t website www.junit.org v trch ra file src.jar

    2. Trong mi trng Eclipse to mt project mi c tnjunit

    3. Chuyn file src.jarvo projectjunit: Kch vo menu FileImportZip fileNext (xem Hnh A1) Browse chuyn n v tr file src.jarri chn la ccmc nhc minh ha Hnh A2Finish

    Hnh A1

    Hnh A2

    4. C th thm phn h tr Javadoc: Kch phi vo project junit PropertiesJavadoc Location chng dn v folderjunit (xem v d minh ha HnhA3)

  • 8/14/2019 KiemThuChuongTrinhVoiJUnit

    10/10

    Hnh A3

    Cc bc t 1 n 4 ch cn c thc hin mt ln duy nht. Sau ny mi khi to ramt project chng trnh mi v mun kim th dng JUnit, ta cn thng bo cho

    project ny ng dn n junit nh sau: Click phi vo project cn p dng JUnit PropertiesJava Build Path

    click thProject ri chnjunit (xem minh ha Hnh A4)OK

    Hnh A4