Využitie používateľskej projekcie na Unit Testing

cache.jpg V pred­chád­za­jú­cej čas­ti sme sa oboz­ná­mi­li s ba­líč­kom % Unit­Tes­ting a uká­za­li sme na prak­tic­kom prík­la­de, ako s ním pra­co­vať. Asi vám v prie­be­hu čí­ta­nia na­pad­lo, či by ne­bo­lo mož­né tvor­bu tes­to­va­cích tried ne­ja­ko auto­ma­ti­zo­vať. Je to mož­né, do­kon­ca to nie je nič zlo­ži­té. Na­vy­še sa ako bo­nus nau­čí­me vy­tvá­rať po­uží­va­teľ­ské pro­jek­cie. Ak ste za­tiaľ s pro­jek­cia­mi nep­ra­co­va­li, po­tom ved­zte, že je to mec­han­izmus, kto­rý Cac­hé ok­rem iné­ho po­uží­va pri tvor­be proxy tried za­stu­pu­jú­cich trie­dy Cac­hé v pros­tre­dí hos­ti­teľ­ských tec­hno­ló­gií, ako sú C++ a Ja­va či EJB. To však nie je zďa­le­ka je­di­né mož­né po­uži­tie pro­jek­cie. A my vám jed­no ta­ké­to net­ra­dič­né po­uži­tie uká­že­me.

Ako pro­jek­cia Cac­hé fun­gu­je? Ak chce­me ap­li­ko­vať na na­šu trie­du jed­nu ale­bo viac pro­jek­cií, jed­no­duc­ho v rám­ci te­la trie­dy pri­dá­me dek­la­rá­ciu PRO­JEC­TION. Kód ob­siah­nu­tý v trie­de im­ple­men­tu­jú­cej pro­jek­ciu (áno, pro­jek­cie sú oby­čaj­né trie­dy) sa vy­ko­ná­va v rám­ci kaž­dej kom­pi­lá­cie trie­dy ob­sa­hu­jú­cej da­nú pro­jek­ciu, a to na zá­ver kom­pi­lač­né­ho pro­ce­su, te­da po tom, čo sa vy­tvo­rí run­ti­me kód a de­fi­ní­cie ta­bu­liek (pri per­zis­ten­tných trie­dach). Z to­ho vy­plý­va, že pro­jek­cia ne­me­ní kom­pi­lo­va­nú trie­du, ale mô­že ro­biť čo­koľ­vek iné, nap­rík­lad ge­ne­ro­vať sú­bo­ry či iné trie­dy.

Pro­jek­ciu vy­tvo­rí­me jed­no­duc­hým od­de­de­ním od bá­zo­vej trie­dy % Stu­dio.AbstractPro­jec­tion. Pro­jek­cia po­nú­ka na im­ple­men­to­va­nie dve sta­tic­ké me­tó­dy:
• Crea­teP­ro­jec­tion
• Re­mo­veP­ro­jec­tion

Pr­vá me­tó­da sa vy­ko­ná po ukon­če­ní kom­pi­lá­cie trie­dy, dru­há po­tom pred kom­pi­lá­ciou (pres­nej­šie pred vy­ge­ne­ro­va­ním run­ti­me kó­du) ale­bo pri zma­za­ní de­fi­ní­cie trie­dy.

A te­raz jed­no­duc­hý prík­lad: Bu­de­me im­ple­men­to­vať pre jed­no­duc­hosť iba me­tó­du Crea­teP­ro­jec­tion. V te­le me­tó­dy vy­uži­je­me trie­dy v ba­lí­ku % Di­ctio­na­ry na prec­hád­za­nie de­fi­ní­ciou kom­pi­lo­va­nej trie­dy a ku kaž­dej spus­ti­teľ­nej me­tó­de vy­tvo­rí­me dek­la­rá­ciu tes­to­va­cej me­tó­dy v tes­to­va­cej trie­de. Kód je po­mer­ne kom­pakt­ný, a tak tu uve­die­me ce­lú de­fi­ní­ciu trie­dy pro­jek­cie.

Class tt.pro­jec­tion.Unit­Test Extends %Pro­jec­tion.AbstractPro­jec­tion
{

Pa­ra­me­ter EXPOR­TFOL­DER As STRING;

/// This met­hod is called by the Class Com­pi­ler whe­ne­ver an as­so­cia­ted 
/// class has fi­nis­hed com­pi­ling. clas­sna­me con­tains the na­me of 
/// the as­so­cia­ted class whi­le pa­ra­me­ters con­tains an array of the 
/// pro­jec­tion pa­ra­me­ters subscrip­ted by pa­ra­me­ter na­me. The mo­di­fied
/// for an in­cre­men­tal com­pi­le will con­tain a com­ma se­pa­ra­ted list of the met­hods that were
/// mo­di­fied and it will be blank for a full com­pi­le

/// Any errors re­por­ted by this met­hod are re­por­ted by the Class Com­pi­ler but
/// do not ef­fect class com­pi­la­tion in any way.
Clas­sMet­hod Crea­teP­ro­jec­tion(
	clas­sna­me As %String,
	By­Ref pa­ra­me­ters As %String,
	mo­di­fied As %String) As %Sta­tus
{
	#dim tMeth as %Di­ctio­na­ry.Met­hod­De­fi­ni­tion
	// prej­di de­fi­ni­ciu trie­dy a vy­tvor no­vu trie­du (iba ak neexis­tu­je) a praz­dne tes­to­va­cie me­to­dy (iba ak neexis­tu­ju)
	s len=$l(clas­sna­me,".")
	s ut­clas­sna­me=clas­sna­me_".Unit­Test"
	
	if ##class(%Di­ctio­na­ry.Clas­sDe­fi­ni­tion).%Exis­tsId(ut­clas­sna­me) {
		s tUT­Clas­sDef=##class(%Di­ctio­na­ry.Clas­sDe­fi­ni­tion).%Ope­nId(ut­clas­sna­me)
		s msg="Mo­di­fi­ku­ji tes­to­va­ci tri­du "_ut­clas­sna­me
	} el­se {
		s msg="Vy­tva­rim tes­to­va­ci tri­du "_ut­clas­sna­me
		s tUT­Clas­sDef=##class(%Di­ctio­na­ry.Clas­sDe­fi­ni­tion).%New()
		s tUT­Clas­sDef.Na­me=ut­clas­sna­me
		s tUT­Clas­sDef.Su­per="%Unit­Test.Tes­tCa­se"
		s tSC=tUT­Clas­sDef.%Sa­ve()
		i $$$ISERR(tSC) w $Sys­tem.Sta­tus.Ge­tError­Text(tSC)
	}
	w !,"*******************************************************"
	w !,msg
	w !,"*******************************************************"
	
	// prej­di me­to­dy... - iba ve­rej­ne
	s tClas­sDef=##class(%Di­ctio­na­ry.Clas­sDe­fi­ni­tion).%Ope­nId(clas­sna­me)
	s m="" f {
		s tMeth=tClas­sDef.Met­hods.Get­Next(.m) quit:m=""
		if tMeth.Inter­nal!(tMeth.Pri­va­te) con­ti­nue
		s tUT­Met­hNa­me(0)="Test"_tMeth.Na­me_"OK"
		s tUT­Met­hNa­me(1)="Test"_tMeth.Na­me_"NOK"
		f i=0:1:1 {
			if '##class(%Di­ctio­na­ry.Met­hod­De­fi­ni­tion).%Exis­tsId(ut­clas­sna­me_"||"_tUT­Met­hNa­me(i)) {
				s tUT­Meth=##class(%Di­ctio­na­ry.Met­hod­De­fi­ni­tion).%New()
				s tUT­Meth.Na­me=tUT­Met­hNa­me(i)
				s tUT­Meth.Clas­sMet­hod=0
				s tUT­Meth.pa­rent=tUT­Clas­sDef
				d tUT­Meth.Im­ple­men­ta­tion.Wri­te­Li­ne("	// TO­DO: dop­sat pa­ra­me­te­ry atd...")
				d tUT­Meth.Im­ple­men­ta­tion.Wri­te­Li­ne("	// do ..As­sert")
				d tUT­Meth.Im­ple­men­ta­tion.Wri­te­Li­ne("	quit")				
				s tSC=tUT­Meth.%Sa­ve()
				i $$$ISERR(tSC) w $Sys­tem.Sta­tus.Ge­tError­Text(tSC)
			}
		}
	}
	
	// po­tom vy­expor­tuj do ur­ce­ne­ho ad­re­sa­ra
	s expor­tfi­le=$s($e(pa­ra­me­ters("EXPOR­TFOL­DER"),*)="\":pa­ra­me­ters("EXPOR­TFOL­DER"),1:pa­ra­me­ters("EXPOR­TFOL­DER")_"\")_ut­clas­sna­me_".xml"
	d $Sys­tem.OBJ.Export(ut­clas­sna­me_".cls",expor­tfi­le)
	w !,"*******************************************************"
	QUIT $$$OK
}

}

Te­raz už sta­čí len pri­dať de­fi­ní­ciu na­mi vy­tvo­re­nej pro­jek­cie do trie­dy tt.Tip18 z pred­chád­za­jú­cej čas­ti. To vy­ko­ná­me jed­no­duc­ho pri­da­ním dek­la­rá­cie

Pro­jec­tion UT As tt.pro­jec­tion.Unit­Test(EXPOR­TFOL­DER = "c:\temp");

Všim­ni­te si, že na­ša pro­jek­cia za­vád­za pa­ra­me­ter EXPOR­TFOL­DER, do kto­ré­ho bu­de­me expor­to­vať tes­to­va­cie trie­dy. A te­raz už sta­čí iba trie­du tt.Tip18 skom­pi­lo­vať:

Com­pi­la­tion star­ted on 03/02/2010 13:25:18 with quali­fiers 'ckbu'
Com­pi­ling class tt.Tip18 
Com­pi­ling rou­ti­ne tt.Tip18.1
*******************************************************
Mo­di­fi­ku­ji tes­to­va­ci tri­du tt.Tip18.Unit­Test
*******************************************************
Expor­ting to XML star­ted on 03/02/2010 13:25:18
Expor­ting class: tt.Tip18.Unit­Test
Export fi­nis­hed suc­ces­sful­ly.

*******************************************************
Com­pi­la­tion fi­nis­hed suc­ces­sful­ly in 0.093s.

Uve­de­ný text je vý­pi­som ok­na Out­put Stu­dia pri kom­pi­lá­cii. Ma­lý kvíz na zá­ver: Po­uží­va ZEN fra­mework pro­jek­cie, ale­bo nie?

Ďal­šie čas­ti >>

Zdroj: Infoware 3/2011



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

No­vá im­ple­men­tá­cia dy­na­mic­ké­ho SQL
Kedysi dávno sme sa venovali tvorbe dopytov s použitím ručne písaného kódu bez jazyka SQL. V tejto časti si, naopak, ukážeme, akým spôsobom sa v Caché vyvíjali dopyty, a oboznámime sa s najnovšou implementáciou dynamických dopytov SQL. čítať »
 
Dy­na­mic­ké od­ba­ve­nie vlas­tnos­tí a me­tód tried
V tejto časti nášho seriálu sa oboznámime s veľmi užitočnou schopnosťou tried Caché, ktorá je k dispozícii už dlhší čas, ale až v posledných verziách sa dostáva viac do popredia čítať »
 
Prá­ca s trie­dou %In­staller
V tomto pokračovaní seriálu vám ukážeme použitie ešte stále pomerne čerstvej novinky, určenej na používateľskú úpravu inštalácie Caché. čítať »
 
Vy­uži­tie po­uží­va­teľ­skej pro­jek­cie na Unit Tes­ting
V predchádzajúcej časti sme sa oboznámili s balíčkom % UnitTesting a ukázali sme na praktickom príklade, ako s ním pracovať. Asi vám v priebehu čítania napadlo, či by nebolo možné tvorbu testovacích tried nejako automatizovať. čítať »
 
Tes­to­va­nie kó­du po­mo­cou Unit Tes­ting nás­tro­ja Cac­hé
Koľkí z nás vývojárov môžu na otázku, či testujú svoj kód, odpovedať úprimne: áno? čítať »
 
Try – catch ošet­re­nie chýb a pre­po­je­nie do sys­té­mo­vé­ho pro­to­ko­lu chýb
Na početné otázky priaznivcov programovania s vysokovýkonnou objektovou databázou InterSystems Caché vám prinášame niekoľko aktuálnych tipov a trikov. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter