从 Cygwin 命令行运行所有程序集中的所有 NUnit 测试
-
26-09-2019 - |
题
我正在尝试创建一个简短的 bash 脚本,可以在 cygwin 中运行,以使用 nunit-console 执行 .NET 项目中的所有 nunit 测试。目前,我的 nunit 系统版本别名为“nunit”,因此如果我运行“nunit”,它将执行 nunit-console。
我的第一步是尝试递归地找到所有测试程序集。这最有效:
find . -name *.Test*.dll
但它返回 dll 的 /obj 和 /bin 版本。
其次,我需要找出一种方法,将 find 的所有结果传递给 nunit,最好是在一次执行中,到目前为止我不知道该怎么做。
有任何 cygwin / bash 专家可以提供帮助吗?
解决方案
是否集的列表动态地改变?如果不经常更改,那么你可能并不需要确定哪些组件在运行时运行。相反,你的问题是更好地通过使用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控制台tests.nunit将运行在App和Widget组件所有的测试,在调试文件夹中。您也可以省略配置和activeconfig的东西,如果它是不相关的,只是名单组件,将永远被测试,无论主动配置的。
其他提示
这是我的工作脚本
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 本身存在问题(请参阅 这个问题 了解详情)。我没有找到解决此问题的方法,因此我仅在构建服务器上进行负错误代码检查。在本地 bash 控制台中,我只提供积极的信息。
像这样:
find . -name "*.Test*.dll" -path /path/to/skip -prune -o -exec nunit {} \;
未经检验的 - 尝试这样的第一,看它是否给你正确的文件:
find . -name "*.Test*.dll" -path /path/to/skip -prune -o -print