从Cygwin命令行在所有程序集中运行所有NUnit测试

时间:2010-09-01 15:04:06

标签: bash nunit cygwin nunit-console

我正在尝试创建一个简短的bash脚本,有人可以在cygwin中运行,使用nunit-console在.NET项目中执行所有nunit测试。目前我将系统版本的nunit别名为“nunit”,所以如果我运行“nunit”它将执行nunit-console。

我的第一步是尝试递归查找所有测试程序集。这个主要工作:

find . -name *.Test*.dll

但它返回dll的/ obj和/ bin版本。

其次我需要找到一种方法将该查找的所有结果传递给nunit,最好是在一次执行中,到目前为止我还不知道如何做。

任何cygwin / bash大师都可以提供帮助吗?

3 个答案:

答案 0 :(得分:4)

程序集列表是否动态更改?如果它不经常更改,那么您可能不需要确定在运行时运行的程序集。相反,通过使用NUnit项目可以更好地解决您的问题。例如,创建文件tests.nunit,内容为:

<NUnitProject>
  <Settings activeconfig="Debug"/>
  <Config name="Debug">
    <assembly path="ProjectA\bin\Debug\App.dll"/>
    <assembly path="ProjectB\bin\Debug\Widget.dll"/>
  </Config>
  <Config name="Release">
   <assembly path="ProjectA\bin\Release\App.dll"/>
    <assembly path="ProjectB\bin\Release\Widget.dll"/>
  </Config>
</NUnitProject>

运行nunit-console tests.nunit将运行Debug文件夹中App和Widget程序集中的所有测试。如果它不相关,你也可以省略Config和activeconfig的东西,只列出无论活动配置如何都会一直测试的程序集。

查看NUnit documentation on running on multiple assemblies

答案 1 :(得分:1)

这是我的工作脚本

check_err()
{
    # parameter 1 is last exit code
    # parameter 2 is error message that should be shown if error code is not 0
    if [ "${1}" -ne "0" ]; then
        cat '~temp.log'
        echo ${2}
        rm -f '~temp.log' > /dev/null
        exit ${1}
    fi;
    rm -f '~temp.log' > /dev/null
}

for i in `find . -print | grep 'bin/Debug/[^/]*\.Tests\.dll$'`; do
    echo "Running tests from ${i} with NUnit...";
    cmd.exe /c "Lib\NUnit\nunit-console.exe ${i} /framework:net-4.0" > '~temp.log'
    check_err $? "Some tests failed."
done

但是有一个微妙的问题。 NUnit有时会返回负面错误代码,这对于Windows来说是可以的,但对于* nix则是非法的。我不知道Cygwin如何处理负退出代码,但MinGW32只是将它们视为0,即结果为"$?" == "0"

好消息,NUnit的负面错误代码有点罕见,并且表明运行NUnit本身存在问题(有关详细信息,请参阅this question)。我没有找到解决此问题的方法,因此我只在构建服务器上检查否定错误代码。在bash控制台的本地,我只处理正面的。

答案 2 :(得分:0)

这样的事情:

find . -name "*.Test*.dll" -path /path/to/skip -prune -o -exec nunit {} \;

未经测试 - 首先尝试这样做以确定它是否为您提供了正确的文件:

find . -name "*.Test*.dll" -path /path/to/skip -prune -o -print