1 / 72

Nyílt Fejlesztőrendszerek Plugin fejlesztés

Nyílt Fejlesztőrendszerek Plugin fejlesztés. Extension point-ok. Safe platform rule „ As the provider of an extension point, you must protect yourself against misbehavior on the part of extenders ” A felkínált kiegészítési pontnak biztonságosnak kell lenni, még a kiegészítés hibája esetén is!

pegeen
Télécharger la présentation

Nyílt Fejlesztőrendszerek Plugin fejlesztés

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Nyílt FejlesztőrendszerekPlugin fejlesztés

  2. Extension point-ok • Safe platform rule • „As the provider of an extension point, you must protect yourself against misbehavior on the part of extenders” • A felkínált kiegészítési pontnak biztonságosnak kell lenni, még a kiegészítés hibája esetén is! • Invitation rule • „Whenever possible, let others contribute to your contributions”

  3. Extension point-ok • Fair play rule • „All clients play by the same rules, even me.” • Ne legyen saját „hátsó bejárat”, rejtett interfész • Explicit Extension Rule • „Declare explicitly where a platform can be extended” • A deklaráció a plugin.xml-ben • Diversity Rule • „Extension points accept multiple extensions”

  4. Extension point-ok • Hogyan kérdezhetjük le a ponthoz tartozó kiegészítéseket? • Platform.getExtensionRegistry() • IExtensionRegistry.getExtensionPoint(String) • IExtension[] IExtensionPoint.getExtensions() • IExtension.getConfigurationElements() • Az adott elem attribútumait, gyerekeit tartalmazza • Validáció kérhető

  5. Extension point-ok • Hogyan példányosítjuk a megadott osztályt? • Csak egy osztálynév van • A mi classloader-ünk nem találhatja meg, mert nincs a függő plugin-ok listáján • Nem is biztos, hogy kívülről látszik az osztály • Megoldás: kérjük meg az extension plug-in saját classloader-ét, hogy végezze el a piszkos munkát! • IConfigurationElement.createExecutableExtension(String)

  6. Extension-ök értesítése/hívása • Hogyan értesítjük az extension-t? • Adott hívási felület (interface) • Fel kell készülni a hibákra, exception-ökre • Kivételkezelés! • Minden extension hívást külön try-catch blokkban • Fault containment region… • Good fences rule: „When passing control outside your code, protectyourself.” • Intézményesített gyanakvás: ISafeRunnable

  7. Extension-ök értesítése/hívása • ISafeRunnable • public void run() – ebbe tegyük a futtatandó kódot • public void handleException(Throwable) • Kezeli a kivételeket, amik futtatás közben keletkeztek • Például kidobhatjuk az extension-t, ha bajt okozott

  8. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); }

  9. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Végigmegyünk az extension-ökön

  10. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Kivesszük a következőt

  11. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Csinálunk egy új burkoló-osztályt

  12. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Aki hibázik, azt eldobjuk

  13. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Meghívjuk az extension egyik metódusát

  14. Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Végrehajtjuk a runnable-t.

  15. Csomagolás, publikálás • Ha készen áll a plugin-ünk a felhasználásra • Be kell csomagolni • Hangolni kell a plugin.xml opcióit • Telepítési cél • Saját gépünk • Más gépek • Automatikus telepítés/frissítés

  16. Csomagolás, publikálás • Könyvtárak – library • A csomagolás első lépése • Osztályainkat jar fájlokba csomagtatjuk • Lehet bináris vagy forrás csomag • Megmondhatjuk, mely osztályok látszódhatnak kívülről • A kész libeket és egyéb fájlokat csomagolhatjuk össze az exporthoz • Lehet bináris és forrás bundle

  17. Csomagolás, publikálás • Finomhangolás • Nem használt függőségek kiirtása • Automatikus ellenőrző eszközökkel • Plugin neve, készítő, … • Verziószám beállítása • Export • File -> Export -> Deployable plug-ins and fragments • Az eredmény egy könyvtár, ami tartalmazza a plugint.

  18. Feature • Egy témához kapcsolódó plug-inek gyűjteménye • Könnyebb menedzselhetőség érdekében jött létre • Az automatikus letöltés és telepítés atomi egysége

  19. Feature • Kiegészítő információk • License aggreement • License rule „always supply a license with every contribution” • Upgrade site-ok listája • Feature saját verziója • Szükséges pluginok verziója

  20. Update site • Automatikusan létrehozott weblap • Feature-ök elhelyezésére • Publikálás • Letöltés • Upgrade • Lista az elérhető feature-ökről és verziókról • Megkönnyíti a szoftver elosztást

  21. Eddig • Egyszerű plugin létrehozása • Kiterjesztések létrehozása • Kiterjesztési pontok létrehozása • Plugin csomagolás • Feature létrehozás • Update site

  22. Plugin fejlesztés teszteléssel

  23. JUnit • Regressziós teszt keretrendszer • Erich Gamma és Kent Beck írta • Unit tesztelésre használatos Java-ban • Nyílt forráskódú • IBM CPL licensz alatt elérhető

  24. JUnit • Web: http://junit.org/index.htm • Az Eclipse tartalmazza a JUnit-ot • GUI-t is kínál a tesztek futtatásához • Eclipse-n kívül is futtathatóak a tesztek

  25. Eclipse - JUnit • A JUnit beállítása a Preferences ablakban lehetséges • Általában jók az alapbeállítások • Szűrőket lehet megadni, hogy mely csomagok és osztályok jelenjenek meg a stack trace-ben

  26. TestCase - teszteset • Több tesztet is futtathat • A TestCase osztályból származik • Definiálja, hogy mely tagváltozók tartalmazzák a teszt állapotát az osztályon belül • Inicializálás a setUp metódussal • Takarítás a tearDown metódussal

  27. TestCase készítése • Csináljunk egy új osztályt a project-ben • Adjuk hozzá a junit.jar-t a függőségekhez

  28. TestCase létrehozása • Kiválasztjuk a csomagot, ahova a tesztet rakni szeretnénk • A new menüből válasszuk a JUnit Test Case-t. • Elnevezzük, stb. • Egy megfelelő osztály létrejön

  29. Példa: TestCase package com.espirity.course.testing; import junit.framework.TestCase; public class FirstTestCase extends TestCase { public FirstTestCase(String arg0) { super(arg0); } public static void main(String[] args) { } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } }

  30. TestCase létrehozása • Minden „test”-tel kezdődő metódus tesztként lesz kezelve az osztályban • Sok teszt metódusunk lehet • Minden teszt metódus többféle „assert” metódust használhat, hogy a tesztelés alatt álló osztályok állapotát vizsgálja • Az assert metódusok öröklöttek

  31. TestCase létrehozása • Assert • assertEqual(x,y) • assertFalse(boolean) • assertTrue(boolean) • assertNull(Object) • assertNotNull(Object) • asserSame(Object,Object) • assertNotSame(Object,Object)

  32. Példa: TestCase package testing; import junit.framework.TestCase; public class FirstTestCase extends TestCase { public FirstTestCase(String arg0) { super(arg0); } public static void main(String[] args) {} protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } public void testCompareSucceed() { assertEquals(0, 0); //this assertion will succeed } public void testCompareFail() { assertEquals(0, 1); //this assertion will fail }}

  33. TestCase futtatása • Válasszuk ki az osztályt • Run -> Run as -> JUnit Test • Lefutnak a tesztek • Az eredmény a JUnit view-ban jelenik meg.

  34. JUnit view • Információk • Piros/zöld a teszt eredménye hiba/ok • Látható a meghiúsult tesztek neve • Látható a hiba trace • Látható a lefutott tesztek száma • Látható a hibák száma

  35. TestSuite • Több TestCase vagy Suite futtatása • A TestSuite osztályból örököltetjük • Létrehozás varázslóval… • File->New->Other…->Java->JUnit • A varázslóban válasszuk a JUnit Test Suite opciót • Megadhatjuk a résztevő Case-eket

  36. Példa: TestSuite packagecom.espirity.course.testing; importjunit.framework.Test; public classAllInclusiveTestSuite { public staticTest suite() { TestSuite suite = newTestSuite("Test for com.espirity.course.testing"); //$JUnit-BEGIN$ suite.addTestSuite(FirstTestCase.class)); suite.addTestSuite(SecondTestCase.class)); //$JUnit-END$ returnsuite; } }

  37. TestSuite futtatás • Hasonló a TestCase-éhez • Minden megadott TestCase lefut • A JUnit ablak tartalmazza az eredményeket • Fontos: TestSuite is adható TestSuite-hoz!

  38. PDE JUnit • JUnit támogatás plug-in fejlesztéshez • A sima JUnit nem használható • Nem Workbench-ben fut • Az Eclipse plug-inok nem leérhetőek • PDE JUnit • Külön futtatási mód

  39. Plugin futtatás Alap Eclipse, ezen dolgozunk

  40. Plugin futtatás Projectek a workbench-ben

  41. Plugin futtatás Ha plugint futtatunk egyúj Eclipse példány indul

  42. Plugin futtatás Betöltődik a plugin-unk

  43. Plugin futtatás Külön workspace látszik

  44. Plugin teszt futtatás Teszt projekt a workspace-ben

  45. Plugin teszt futtatás A teszt is betöltődik, valamint a teszt futtató

  46. PDE JUnit működés • Írunk egy tesztet (ugyanúgy, mint alapesetben) • Futtatjuk JUnit Plug-in Test-ként • Egy Eclipse ablak nyílik, majd a tesztek lefutása után bezáródik • A teszteredményt a szokásos ablakban találhatjuk meg

  47. PDE JUnit működés • Hol legyenek a tesztek? • Lehet a tesztelendő plug-inban is • De! • A JUnit függőségeket be kell építeni • Keveredik a kód és a teszt • Tegyük külön plug-inba, ami könnyen leválasztható • Ez függ az eredeti plug-in-től

  48. Mit teszteljünk? • Nyilván csak a meghajtható részek (API) tesztelhető • Nincs lehetőség közvetlen GUI tesztre • Rational Robot • Amit tesztelni szeretnénk, látható kell legyen • Erősen függ a konkrét plug-intól

  49. Gyakori kiterjesztések

  50. View • Általános információ-megjelenítő elem • Extension point: • org.eclipse.ui.views • If: IViewPart • Sokféle lehetőség van információ megjelenítésére • Tartalmazhat SWT és JFace elemeket is

More Related