I recently had the fortunate opportunity to be given a project of my own to work on. I would say that Agile practices are extremely important to me and I do my best to put these into practice every day. Currently we use CruiseControl.NET as out continuous integration server and I wanted to get our tests integrated into the process, so I decided to create a new build script and create a new cruise control project for this purpose. For those of you who are pausing and saying...What, you do not have your tests integrated into your build. I agree. Sometimes things take a little longer to get into place than we would like, but we are getting there slowly but surely.
I must say that after my experience today I have an even higher level of respect for build/release engineers. It took me all day to get the nant script to do as I wanted it to do and to get the test results output I desired. As a practice we keep all of our test projects in a directory named tests at the root of our directory hierarchy. I created a new solution that contained only the tests that I wanted to integrate into the build.
The build script runs msbuild on the solution file and then does some magic to copy the directory structure into a build-temp directory which is the directory where the nunit-console.exe is applied to the dll. The process is broken into a number of tasks namely build the solution, copy the test project structure to a build-temp directory, run nunit-console.exe on the test dll's and then copy the results of those tests to the test-results directory. The script looks a little like this:
This copies the results of the build into a build-temp directory
<target name="copy-tests" depends="build">
<echo message="Copying tests to ${build.dir}\tests" />
<mkdir dir="${build.dir}\tests"/>
<copy todir="${build.dir}\tests">
<fileset basedir="tests" failonempty="true">
<include name="*PatternOfTestsToInclude*/**"/>
</fileset>
</copy>
</target>
This iterates through the directories and executes nunit-console.exe on each Test dll file. It moves the results of the test to the test.results directory
<target name="tests" depends="copy-tests">
<echo message="Create directory ${results.dir}"/>
<mkdir dir="${results.dir}"/>
<echo message="Create directory ${test.results}"/>
<mkdir dir="${test.results}"/>
<echo message="Running Nunit Tests"/>
<foreach item="Folder" property="foldername">
<in>
<items>
<include name="${build.dir}\tests\*"/>
</items>
</in>
<do>
<echo message="Iterating through folder ${foldername}\bin\${build-configuration}"/>
<foreach item="File" property="filename">
<in>
<items>
<include name="${foldername}\bin\${build-configuration}\*Test*.dll"/>
</items>
</in>
<do>
<echo message="Running test for file ${filename}"/>
<echo message="Writing test results to test-results.xml for dll ${filename}"/>
<exec program="${nunit-console.exe}" failonerror="false" resultproperty="testresult">
<arg value="${filename}"/>
<arg value="/xml=test-results.xml" />
</exec>
<property name="niceFileName" value="${path::get-file-name-without-extension(filename)}"/>
<move
file="test-results.xml"
tofile="${test.results}\${niceFileName}-test-results.xml"
overwrite="true"/>
<fail message="Failures reported in unit test for ${filename}." unless="${int::parse(testresult)==0}" />
</do>
</foreach>
</do></foreach></target>
This approach is cool because I can inject into the script the pattern I want to use to select the test groups I want as a part of my test suite. In my situation this makes sense because I only want those tests that are specific to my project. As long as you use some standard naming conventions for your tests then you are good.
Powered by Qumana