teach run_tests how to run C# tests with NUnitLite

pull/6134/head
Jan Tattermusch 9 years ago
parent 31b8316ab9
commit 38ed2cfdb5
  1. 21
      tools/run_tests/post_tests_csharp.bat
  2. 27
      tools/run_tests/post_tests_csharp.sh
  3. 30
      tools/run_tests/run_csharp.bat
  4. 69
      tools/run_tests/run_tests.py

@ -0,0 +1,21 @@
@rem Runs C# tests for given assembly from command line. The Grpc.sln solution needs to be built before running the tests.
setlocal
@rem enter src/csharp directory
cd /d %~dp0\..\..\src\csharp
@rem Generate code coverage report
@rem TODO(jtattermusch): currently the report list is hardcoded
packages\ReportGenerator.2.4.4.0\tools\ReportGenerator.exe -reports:"coverage_csharp_*.xml" -targetdir:"..\..\reports\csharp_coverage" -reporttypes:"Html;TextSummary" || goto :error
@rem Generate the index.html file
echo ^<html^>^<head^>^</head^>^<body^>^<a href='csharp_coverage/index.htm'^>csharp coverage^</a^>^<br/^>^</body^>^</html^> >..\..\reports\index.html
endlocal
goto :EOF
:error
echo Failed!
exit /b %errorlevel%

@ -30,26 +30,15 @@
set -ex set -ex
CONFIG=${CONFIG:-opt} if [ "$CONFIG" != "gcov" ] ; then exit ; fi
NUNIT_CONSOLE="mono packages/NUnit.ConsoleRunner.3.2.0/tools/nunit3-console.exe"
# nunit3-console fails if nunit.framework.dll is not found.
cp -n src/csharp/packages/NUnit.3.2.0/lib/net45/nunit.framework.dll src/csharp/packages/NUnit.ConsoleRunner.3.2.0/tools/
# change to gRPC repo root # change to gRPC repo root
cd $(dirname $0)/../.. cd $(dirname $0)/../..
(cd src/csharp; $NUNIT_CONSOLE $@) # Generate the csharp extension coverage report
gcov objs/gcov/src/csharp/ext/*.o
if [ "$CONFIG" = "gcov" ] lcov --base-directory . --directory . -c -o coverage.info
then lcov -e coverage.info '**/src/csharp/ext/*' -o coverage.info
# Generate the csharp extension coverage report genhtml -o reports/csharp_ext_coverage --num-spaces 2 \
gcov objs/gcov/src/csharp/ext/*.o -t 'gRPC C# native extension test coverage' coverage.info \
lcov --base-directory . --directory . -c -o coverage.info --rc genhtml_hi_limit=95 --rc genhtml_med_limit=80 --no-prefix
lcov -e coverage.info '**/src/csharp/ext/*' -o coverage.info
genhtml -o reports/csharp_ext_coverage --num-spaces 2 \
-t 'gRPC C# native extension test coverage' coverage.info \
--rc genhtml_hi_limit=95 --rc genhtml_med_limit=80 --no-prefix
fi

@ -1,30 +0,0 @@
@rem Runs C# tests for given assembly from command line. The Grpc.sln solution needs to be built before running the tests.
setlocal
@rem enter src/csharp directory
cd /d %~dp0\..\..\src\csharp
rem nunit3-console fails if nunit.framework.dll is not found.
copy packages\NUnit.3.2.0\lib\net45\nunit.framework.dll packages\NUnit.ConsoleRunner.3.2.0\tools\nunit.framework.dll
if not "%CONFIG%" == "gcov" (
packages\NUnit.ConsoleRunner.3.2.0\tools\nunit3-console.exe %* || goto :error
) else (
@rem Run all tests with code coverage
packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"packages\NUnit.ConsoleRunner.3.2.0\tools\nunit3-console.exe" -targetdir:"." -targetargs:"%*" -filter:"+[Grpc.Core]*" -register:user -output:coverage_results.xml || goto :error
packages\ReportGenerator.2.4.4.0\tools\ReportGenerator.exe -reports:"coverage_results.xml" -targetdir:"..\..\reports\csharp_coverage" -reporttypes:"Html;TextSummary" || goto :error
@rem Generate the index.html file
echo ^<html^>^<head^>^</head^>^<body^>^<a href='csharp_coverage/index.htm'^>csharp coverage^</a^>^<br/^>^</body^>^</html^> >..\..\reports\index.html
)
endlocal
goto :EOF
:error
echo Failed!
exit /b %errorlevel%

@ -486,42 +486,46 @@ class CSharpLanguage(object):
def test_specs(self): def test_specs(self):
with open('src/csharp/tests.json') as f: with open('src/csharp/tests.json') as f:
tests_json = json.load(f) tests_by_assembly = json.load(f)
assemblies = tests_json['assemblies']
tests = tests_json['tests']
msbuild_config = _MSBUILD_CONFIG[self.config.build_config] msbuild_config = _MSBUILD_CONFIG[self.config.build_config]
assembly_files = ['%s/bin/%s/%s.dll' % (a, msbuild_config, a) nunit_args = ['--labels=All',
for a in assemblies]
# TODO(jtattermusch): use --x86 when needed
extra_args = ['--labels=All',
'--noresult', '--noresult',
'--workers=1', '--workers=1']
'--inprocess'] + assembly_files
if self.platform == 'windows': if self.platform == 'windows':
script_name = 'tools\\run_tests\\run_csharp.bat' runtime_cmd = []
extra_args += ['--domain=None']
else: else:
script_name = 'tools/run_tests/run_csharp.sh' runtime_cmd = ['mono']
if self.config.build_config == 'gcov': specs = []
# On Windows, we only collect C# code coverage. for assembly in tests_by_assembly.iterkeys():
# On Linux, we only collect coverage for native extension. assembly_file = 'src/csharp/%s/bin/%s/%s.exe' % (assembly, msbuild_config, assembly)
# For code coverage all tests need to run as one suite. if self.config.build_config != 'gcov':
return [self.config.job_spec([script_name] + extra_args, None, # normally, run each test as a separate process
shortname='csharp.coverage', for test in tests_by_assembly[assembly]:
environ=_FORCE_ENVIRON_FOR_WRAPPERS)] cmdline = runtime_cmd + [assembly_file, '--test=%s' % test] + nunit_args
else: specs.append(self.config.job_spec(cmdline,
specs = [] None,
for test in tests: shortname='csharp.%s' % test,
cmdline = [script_name, '--test=%s' % test] + extra_args environ=_FORCE_ENVIRON_FOR_WRAPPERS))
specs.append(self.config.job_spec(cmdline, None, else:
shortname='csharp.%s' % test, # for test coverage, run all tests from the same assembly at once
# on Windows, things get more complicated as we need to run the code coverage tool
if self.platform == 'windows':
cmdline = ['packages\OpenCover.4.6.519\tools\OpenCover.Console.exe',
'-target:%s' % assembly_file,
'-targetdir:src\\csharp',
'-targetargs:%s' % ' '.join(nunit_args),
'-filter:+[Grpc.Core]*',
'-register:user',
'-output:coverage_csharp_%s.xml' % assembly]
else:
cmdline = runtime_cmd + [assembly_file] + nunit_args
specs.append(self.config.job_spec([script_name] + extra_args, None,
shortname='csharp.coverage.%s' % assembly,
environ=_FORCE_ENVIRON_FOR_WRAPPERS)) environ=_FORCE_ENVIRON_FOR_WRAPPERS))
return specs return specs
def pre_build_steps(self): def pre_build_steps(self):
if self.platform == 'windows': if self.platform == 'windows':
@ -544,7 +548,10 @@ class CSharpLanguage(object):
return [['tools/run_tests/build_csharp.sh']] return [['tools/run_tests/build_csharp.sh']]
def post_tests_steps(self): def post_tests_steps(self):
return [] if self.platform == 'windows':
return [['tools\\run_tests\\post_tests_csharp.bat']]
else:
return [['tools/run_tests/post_tests_csharp.sh']]
def makefile_name(self): def makefile_name(self):
return 'Makefile' return 'Makefile'

Loading…
Cancel
Save