čtvrtek 14. dubna 2005

Do pranice: Integrační vs. Unit testy

Jaký druh testů vlastně píšete, položili jste si někdy tuto otázku? Já jsem si tuhle otázku párkrát položil. Možná jste si tuhle otázku položili i vy, ale v jiném kontextu. Co třeba, proč vlastně nepíšu tesy? V mojí praxi jsem shledal několik důvodů, proč vývojáři nepíši testy

  • Nikdy o automatizovaných testech neslyšeli a ani je neviděli.
  • Automatizované testy považují za zbytečnost, jejich kód je bez chyb.
  • Chápou výhody automatizovaných testů, ale neví jak na to.
  • Pracují v tak rychle měnících se podmínkách, že náklady na tvorbu testu, převyšují jeho platnost.

Možná vás napadne ještě nějaký důvod, ale to nic nemění na faktu, že minimálně první, druhý a třetí bod mají něco společného. Podle mého názoru je ten společný jmenovatel nedostatečná osvěta v tomto směru. Nedivil bych si, kdyby jste si teď zaklepali na čelo a namístě odpřísáhli, že o automatizovaných testech se toho píše dost. Máte pravdu je oblast, o které se toho napsalo dost a dost. Tou oblastí jsou takzvané jednotkové alias unit testy.

Integrační vs. Unit testy

Připusťme, že chápeme výhody unit testů a dále připusťme, že tu máme velké množství materiálu, které ukazují jak psát unit testy na velice jednoduchých příkladech. Ještě lépe, na příkladech, které jsou jak vystižené a kde nejsou takměř žádné náklady na napsání testu. A to je ten problém.

Kolik takových unit testů jste v praxi napsali? Jaké množství unit testů připadá na celkový počet vašich testů? Jestli netušíte kam tím mířím, poskytnu malou nápovědu, unit test je pouze a jenom takový test, kdy je objekt testován v izolaci. Kolik objektů ve vašich projektech pracuje autonomně na zbytku systému a můžete je otestovat v izolaci? Pozor to není chyba, ale vlastnost! Ještě jednou se zamyslete, kolik procent z celkového počtu testů tvoří unit testy? V mém případě to bude do 10%.

Dámy a pánové, 90% testů, které jsem napsal, je povahy nejednotkové. Ten zbytek tvoří integrační testy. Přijímám fakt, že integrační testy, tedy testy, kdy se testuje součinnost několika objektů (komponent), jsou náročnější na tvorbu než unit testy. Nepřijímám prostý fakt, že testy nelze psát. Testy nelze psát pouze za určitých podmínek.

Vidím několik specifických sfér, na které by se testy "asi" nedaly napasovat. Opravdovým problémem je to, že na zbytek se vývojáři snaží napasovat unit testy, což je mnohdy krkolemné až nemožné. Říkám:Pišme testy, učme se psát testy, šiřme osvětu a především nezapomínejme, že svět testů nezačíná a nekončí s unit testem....

Do pranice

neděle 10. dubna 2005

Ant, java.io.IOException: CreateProcess a zatrolená konzole

Nemám ve zvyku každou chybu/vlastnost znamenající můj vlastní neúspěch svalovat na někoho jiného, ale jsou věci, které mě docela dopalují. Víte o tom, že Command prompt (Cmd. exe) command-line má omezenou délku vstupu? Pro Windows XP je to 8191 a pro Windows 2000 je to 2047. Už se mi minimálně dvakrát stalo, že mě 2047 znaků pěkně vypeklo.

Poprvé jsem na to narazil v souvislosti s naším aplikačním serverem, kde se nastavovala nechutně dlouhá classpath. Po druhé mě to vypeklo včera, ale narozdíl od prvního případu, odhalit, že za to může omezení délky vstupu zabralo nějaký čas a nervy.

Javadoc na scéně

Ant je pořádně mocný kouzelník a mezi jeho kouzla patří task Javadoc, který vygeneruje dokumentaci ze zdrojových souborů, samozřejmě pokud jí píšete. Včera jsem potřeboval velice nutně vygenerovat právě dokumentaci k API.

 
<target name="javadoc" description="Generates JavaDoc from source files">
   <javadoc
           destdir="${javadoc.dir}"
           author="true"
           version="true"
           use="true"          
    >
     <fileset dir="${src.dir}" >
       <include name="**/*.java" />       
     </fileset> 
   </javadoc>
</target>
 

Bohužel jakékoliv snahy o spuštení tohoto tasku končily (Windows 2000) s výsledkem BUILD FAILED, hláškou failed:java.io.IOException: CreateProcess:" a pěkně dlouhým stack tracem začínajícím na java.lang.Win32Process.create(Native Method). Samozřejmě na mém počítači s Windows XP ten task proběhnul. V tu chvíle jsem samozřejmě zkusil různé verze Antu a Javy, ale nic nepomohlo.

Dneska ráno jsem se rozhodnul, že tomu problému prostě přijdu na kloub. Začal jsem u přítele Googla, který mi po pár otázkách dokázal, že tenhle problém, jako obvykle, mělo plno dalších nebožáků. Celý problém je v tom, že ANT volá javadoc.exe, který se stará o generování dokumentace, předání argumentů je realizováno přes příkazovou řádku. Pak se neni čemu divit, že příkaz lehce přesáhne 2047 znaků.

Naštěstí jsem si vygooglil i řešení, task Javadoc totiž podporuje kouzelný atribut useexternalfile.

indicates whether the sourcefile name specified in srcfiles or as nested source elements should be written to a temporary file to make the command line shorter. Also applies to the package names specified via the packagenames attribute or nested package elements. (yes | no). Default is no.

Za řešení problému jsem vděčen těmto diskusím, 1, 2 a 3