Pergunta

Estou tentando criar um script bash curto que alguém possa executar no cygwin para executar todos os testes nunit em um projeto .NET usando nunit-console.Atualmente eu tenho a versão do sistema nunit com o alias de "nunit", então se eu executar "nunit", ele executará nunit-console.

Meu primeiro passo foi tentar encontrar todos os assemblies de teste recursivamente.Isso funciona PRINCIPALMENTE:

find . -name *.Test*.dll

mas retorna as versões /obj e /bin de uma dll.

Segundo, preciso descobrir uma maneira de passar todos os resultados desse achado para o nunit, de preferência em uma execução que até agora não tenho ideia de como fazer.

Algum guru do cygwin/bash por aí que possa ajudar?

Foi útil?

Solução

A lista de assemblies muda dinamicamente?Se isso não mudar com frequência, provavelmente você não precisará determinar em quais assemblies executar em tempo de execução.Em vez disso, seu problema será melhor resolvido com o uso de um projeto NUnit.Por exemplo, crie o arquivo testes.nunit, com conteúdo:

<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>

A execução de nunit-console testes.nunit executaria todos os testes nos assemblies App e Widget, na pasta Debug.Você também pode omitir o material Config e activeconfig se não for relevante e apenas listar os assemblies que sempre serão testados, independentemente da configuração ativa.

Confira a Documentação do NUnit sobre execução em vários assemblies.

Outras dicas

Aqui está meu script de trabalho para isso

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

Mas há um problema sutil.O NUnit às vezes retorna códigos de erro negativos, o que é aceitável para Windows, mas ilegal para *nix.Não sei como o Cygwin funciona com códigos de saída negativos, mas o MinGW32 apenas os trata como 0, ou seja, "$?" == "0" como resultado.

Boas notícias, códigos de erro negativos são um tanto raros para o NUnit e indicam problemas com a execução do próprio NUnit (consulte essa questão para detalhes).Não encontrei uma solução alternativa para esse problema, portanto, tenho verificação de código de erro negativo apenas no servidor de compilação.Localmente, no console bash, estou entregando apenas os positivos.

Algo assim:

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

Não testado - tente primeiro assim para ver se ele fornece os arquivos corretos:

find . -name "*.Test*.dll" -path /path/to/skip -prune -o -print
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top