<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統計

    其他鏈接

    友情鏈接

    最新評論

    你走你的陽光道,我走我的獨木橋:整合ant ivy 和testng


        近期自己折騰自己,放著正統的maven + junit不用,卻準備用ant + ivy 替代maven做依賴管理,用testng替代junit做單元測試。

        現在要做的工作,其實很簡單,就是ant的腳本中,搞定相關的target: 編譯,運行單元測試。

        需要的步驟大體如下:

    1. ivy 做依賴解析,得到所有依賴的jar包,以便生成編譯源碼需要的classpath路徑
    這里很重要的一點,是需要區(qū)分開編譯正常代碼的classpath和編譯測試代碼的classpath,因為通常情況下testcase需要一些特殊的依賴如juni,testng之類的測試框架,easymock,jmock之類的mock工具。

    2. 編譯代碼和測試案例

    3. 運行testng 來執(zhí)行testcase

        分別來看三者的實現。

    1) ivy解析依賴

    ant代碼如下:

        <target name="ivy.resolve" description="--> resolve project dependencies by ivy">
            
    <echo>resolve dependencies of project "${ant.project.name}" by ivy</echo>
            
    <ivy:resolve />

            
    <ivy:cachefileset setid="ivy.cachefileset.compile" type="jar,bundle" conf="compile" />

            
    <ivy:cachefileset setid="ivy.cachefileset.test" type="jar,bundle" conf="test" />
        
    </target>

    用到了ivy標準的resolve 任務,然后再用cachefileset來獲取需要的文件列表,以備后面使用。注意type要寫成"jar,bundle",因此目前的依賴包雖然擴張名都是jar,但是它的ivy類型定義確有可能為bundle(都是OSGI惹得禍)。還有上面用了兩次cachefileset任務,conf不同。


    2) 編譯代碼和測試案例

    <target name="compile.compile" depends="ivy.resolve" >
            
    <echo>compile project ${ant.project.name} </echo>
            
    <compile_source_main />
            
    <compile_source_test />
        
    </target>

        
    <macrodef name="compile_source_main">
            
    <sequential>
                
    <echo>compile java classes in project ${ant.project.name} </echo>
                
    <echo>classpath is : ${project.classpath.compile.ivy.lib}</echo>
                
    <delete dir="${dir.target.bin.main}" />
                
    <mkdir dir="${dir.target.bin.main}" />
                
    <javac debug="true" srcdir="${dir.src.main.java}" destdir="${dir.target.bin.main}" target="1.5" includeAntRuntime="false">
                    
    <classpath>
                        
    <pathelement location="${dir.src.main.resources}" />
                        
    <fileset refid="ivy.cachefileset.compile" />
                    
    </classpath>
                
    </javac>
            
    </sequential>
        
    </macrodef>

        
    <macrodef name="compile_source_test">
            
    <sequential>
                
    <echo>compile java testcase in project ${ant.project.name} </echo>
                
    <echo>classpath is : ${project.classpath.test.ivy.lib}</echo>
                
    <delete dir="${dir.target.bin.test}" />
                
    <mkdir dir="${dir.target.bin.test}" />
                
    <javac  debug="true" srcdir="${dir.src.test.java}" destdir="${dir.target.bin.test}" target="1.5" includeAntRuntime="false">
                    
    <classpath>
                        
    <pathelement location="${dir.src.test.resources}" />
                        
    <pathelement location="${dir.src.main.resources}" />
                        
    <pathelement location="${dir.target.bin.main}" />
                        
    <fileset refid="ivy.cachefileset.test" />
                    
    </classpath>
                
    </javac>
            
    </sequential>
        
    </macrodef>


    注意這里用到classpath時,是在上面得到的ivy cachefileset的基礎上,增加其他路徑才得到最終的classpath。曾經在這里折騰了不少時間,因為開始是用ivy的cacheclasspath任務直接拿到一個classpath,然后在這里發(fā)現單有這個classpath是不夠的。可是又沒有找到如何從一個classpath生成一個更多內容的classpath的方法(郁悶,ant里面的classpath似乎不支持這種classpath=***+***+classpath的算法,或者是我笨沒有找到)。最后只好改用cachefileset來獲取fileset,然后自己增加其他路徑。典型如編譯測試案例時,必須將前面編譯好的class作為classpath的一部分增加。從這種角度講,ivy的cacheclasspath任務是用處不大的,實用的是cachefileset任務。

    3) 運行testng

    首先需要初始化testng,引入testng的任務。

        <target name="testng.init" depends="ivy.resolve">
            
    <taskdef resource="testngtasks">
                
    <classpath>
                    
    <fileset refid="ivy.cachefileset.test" />
                
    </classpath>
            
    </taskdef>
        
    </target>

    在具體執(zhí)行testng時,有兩種選擇:

    1. 通過testng.xml指定具體的測試案例

    應該說testng對此有非常強大而富有彈性的支持,通過testng.xml可以指定不同的package,class,可以指定exclude,可以分組,還有其他高級特性。

    2. 運行所有案例
    使用testng.xml文件的前提是項目有提供testng.xml文件,對于一些簡單的項目,可能只是簡單的希望執(zhí)行所有testcase,因此就需要在運行檢測testng.xml文件存在與否。

        <target name="testng.test" depends="testng.init">
            
    <if>
                
    <resourceexists>
                    
    <file file="${dir.src.test.java}/testng.xml" />
                
    </resourceexists>
                
    <then>
                    
    <run_testng_with_xml />
                
    </then>
                
    <else>
                    
    <run_testng_without_xml />
                
    </else>
            
    </if>
        
    </target>

    testng.xml存在時,通過xmlfileset來調用testng任務:

        <macrodef name="run_testng_with_xml">
            
    <sequential>
                
    <echo>run testng to test project "${ant.project.name}".</echo>
                
    <echo>found ${dir.src.test.java}/testng.xml, use it to run testng.</echo>
                
    <delete dir="${dir.target.testng.testoutput}" />
                
    <testng outputDir="${dir.target.testng.testoutput}" haltOnfailure="true">
                    
    <xmlfileset dir="${dir.src.test.java}" includes="testng.xml" />
                    
    <classpath>
                        
    <pathelement location="${dir.src.test.resources}" />
                        
    <pathelement location="${dir.src.main.resources}" />
                        
    <pathelement location="${dir.target.bin.test}" />
                        
    <pathelement location="${dir.target.bin.main}" />
                        
    <fileset refid="ivy.cachefileset.test" />
                    
    </classpath>
                
    </testng>
            
    </sequential>
        
    </macrodef>

    testng.xml不存在時,通過classfileset來指定需要執(zhí)行的class:

        <macrodef name="run_testng_without_xml">
            
    <sequential>
                
    <if>
                    
    <resourcecount when="greater" count="0">
                        
    <fileset dir="${dir.target.bin.test}" includes="**/*.class" />
                    
    </resourcecount>
                    
    <then>
                        
    <echo>run testng to test project "${ant.project.name}".</echo>
                        
    <echo>${dir.src.test.java}/testng.xml not found, default to run all the testcase.</echo>
                        
    <delete dir="${dir.target.testng.testoutput}" />
                        
    <testng outputDir="${dir.target.testng.testoutput}" haltOnfailure="true">
                            
    <classfileset dir="${dir.target.bin.test}" includes="**/*.class" />
                            
    <classpath>
                                
    <pathelement location="${dir.src.test.resources}" />
                                
    <pathelement location="${dir.src.main.resources}" />
                                
    <pathelement location="${dir.target.bin.test}" />
                                
    <pathelement location="${dir.target.bin.main}" />
                                
    <fileset refid="ivy.cachefileset.test" />
                            
    </classpath>
                        
    </testng>
                    
    </then>
                    
    <else>
                        
    <echo>no testcase exist in "${dir.target.bin.test}", nothing to do for testng.</echo>
                    
    </else>
                
    </if>
            
    </sequential>
        
    </macrodef>

    注意這里有個檢測,判斷是否有測試案例存在,如果沒有寫測試案例,則跳過testng任務的執(zhí)行,否則如果classfileset為空,testng即得不到testng.xml的輸入,也得不到classfileset的輸入,會直接報錯的,因此需要避免因為沒有測試案例導致test失敗進而整個build都失敗的情況。

    OK,上述三板斧下去,基本ant + ivy + testng就可以完成整合,一起跑起來了。敲一個ant test下去,就可以依賴解析,編譯,執(zhí)行testcase的全套過程。過程比maven + junit復雜多了,主要是一切都要自己動手,不過完成之后的效果似乎還不錯。上述的過程對于一般項目都是通用的,因此以后就可以偷懶了。

    posted on 2010-05-31 16:11 sky ao 閱讀(2489) 評論(0)  編輯  收藏 所屬分類: project building

    主站蜘蛛池模板: 国产va精品免费观看| 亚洲国产精品免费在线观看| 日韩精品一区二区亚洲AV观看| 亚洲综合一区二区精品导航| 中国人免费观看高清在线观看二区| 亚洲一级毛片免费在线观看| 亚洲综合男人的天堂色婷婷| 特级毛片全部免费播放a一级| 日本免费大黄在线观看| 免费国产成人高清视频网站| 亚洲国产日韩在线成人蜜芽| 两个人www免费高清视频| 亚洲中文字幕久久精品无码APP | 国产a视频精品免费观看| 亚洲精选在线观看| 乱人伦中文视频在线观看免费| 免费A级毛片av无码| 久久精品国产亚洲av日韩| 国产成人精品免费视频动漫| 在线综合亚洲中文精品| 最近2019免费中文字幕视频三| 国产亚洲午夜高清国产拍精品| 性色av极品无码专区亚洲| 可以免费看的卡一卡二| 亚洲av午夜福利精品一区| 麻豆一区二区三区蜜桃免费| 亚洲一区二区三区无码中文字幕| 久久亚洲欧美国产精品| 中文字幕亚洲电影| 99re6在线视频精品免费下载 | 亚洲色精品aⅴ一区区三区| 久久久久久AV无码免费网站下载 | 国产精品亚洲专区无码不卡| 毛片免费全部播放一级| 亚洲人成网网址在线看| 国产在线不卡免费播放| 色网站在线免费观看| 亚洲AV无码一区二区乱子伦| 久九九精品免费视频| 国产男女爽爽爽免费视频 | 波多野结衣免费视频观看 |