Files
edx-platform/rakelib/tests.rake
Will Daly 194c906c19 List which test suites failed
Add section headings to test console output

i18n tests generate XUnit reports

Move i18n and docs test commands out of tests.rake
2014-02-04 12:36:19 -05:00

170 lines
5.5 KiB
Ruby

# Set up the clean and clobber tasks
CLOBBER.include(REPORT_DIR, 'test_root/*_repo', 'test_root/staticfiles')
# Create the directory to hold coverage reports, if it doesn't already exist.
directory REPORT_DIR
def test_id_dir(path)
return File.join(".testids", path.to_s)
end
def run_under_coverage(cmd, root)
cmd0, cmd_rest = cmd.split(" ", 2)
# We use "python -m coverage" so that the proper python will run the importable coverage
# rather than the coverage that OS path finds.
cmd = "python -m coverage run --rcfile=#{root}/.coveragerc `which #{cmd0}` #{cmd_rest}"
return cmd
end
def run_tests(system, report_dir, test_id=nil, stop_on_failure=true)
# If no test id is provided, we need to limit the test runner
# to the Djangoapps we want to test. Otherwise, it will
# run tests on all installed packages.
# We need to use $DIR/*, rather than just $DIR so that
# django-nose will import them early in the test process,
# thereby making sure that we load any django models that are
# only defined in test files.
default_test_id = "#{system}/djangoapps/* common/djangoapps/*"
if system == :lms || system == :cms
default_test_id += " #{system}/lib/*"
end
if test_id.nil?
test_id = default_test_id
# Handle "--failed" as a special case: we want to re-run only
# the tests that failed within our Django apps
elsif test_id == '--failed'
test_id = "#{default_test_id} --failed"
end
cmd = django_admin(system, :test, 'test', test_id)
test_sh(system, run_under_coverage(cmd, system))
end
task :clean_test_files do
desc "Clean fixture files used by tests and .pyc files"
sh("git clean -fqdx test_root/logs test_root/data test_root/staticfiles test_root/uploads")
sh("find . -type f -name \"*.pyc\" -delete")
end
task :clean_reports_dir => REPORT_DIR do
desc "Clean coverage files, to ensure that we don't use stale data to generate reports."
# We delete the files but preserve the directory structure
# so that coverage.py has a place to put the reports.
sh("find #{REPORT_DIR} -type f -delete")
end
TEST_TASK_DIRS = []
[:lms, :cms].each do |system|
report_dir = report_dir_path(system)
test_id_dir = test_id_dir(system)
directory test_id_dir
# Per System tasks/
desc "Run all django tests on our djangoapps for the #{system}"
task "test_#{system}", [:test_id] => [
:clean_test_files, :install_prereqs,
"#{system}:gather_assets:test", "fasttest_#{system}"
]
# Have a way to run the tests without running collectstatic -- useful when debugging without
# messing with static files.
task "fasttest_#{system}", [:test_id] => [test_id_dir, report_dir, :clean_reports_dir] do |t, args|
args.with_defaults(:test_id => nil)
run_tests(system, report_dir, args.test_id)
end
task :fasttest => "fasttest_#{system}"
TEST_TASK_DIRS << system
end
Dir["common/lib/*"].select{|lib| File.directory?(lib)}.each do |lib|
report_dir = report_dir_path(lib)
test_id_dir = test_id_dir(lib)
test_ids = File.join(test_id_dir(lib), '.noseids')
directory test_id_dir
desc "Run tests for common lib #{lib}"
task "test_#{lib}", [:test_id] => [
test_id_dir, report_dir, :clean_test_files,
:clean_reports_dir, :install_prereqs
] do |t, args|
args.with_defaults(:test_id => lib)
ENV['NOSE_XUNIT_FILE'] = File.join(report_dir, "nosetests.xml")
cmd = "nosetests --id-file=#{test_ids} #{args.test_id}"
test_sh(lib, run_under_coverage(cmd, lib))
end
TEST_TASK_DIRS << lib
# There used to be a fasttest_#{lib} command that ran without coverage.
# However, this is an inconsistent usage of "fast":
# When running tests for lms and cms, "fast" means skipping
# staticfiles collection, but still running under coverage.
# We keep the fasttest_#{lib} command for backwards compatibility,
# but make it an alias to the normal test command.
task "fasttest_#{lib}" => "test_#{lib}"
end
task :report_dirs
TEST_TASK_DIRS.each do |dir|
report_dir = report_dir_path(dir)
directory report_dir
task :report_dirs => [REPORT_DIR, report_dir]
task 'test:python' => "test_#{dir}"
end
namespace :test do
desc "Run all python tests"
task :python, [:test_id]
end
desc "Build the html, xml, and diff coverage reports"
task :coverage => :report_dirs do
# Generate coverage for Python sources
TEST_TASK_DIRS.each do |dir|
report_dir = report_dir_path(dir)
if File.file?("#{report_dir}/.coverage")
# Generate the coverage.py HTML report
sh("coverage html --rcfile=#{dir}/.coveragerc")
# Generate the coverage.py XML report
sh("coverage xml -o #{report_dir}/coverage.xml --rcfile=#{dir}/.coveragerc")
end
end
# Find all coverage XML files (both Python and JavaScript)
xml_reports = FileList[File.join(REPORT_DIR, '**/coverage.xml')]
if xml_reports.length < 1
puts "No coverage info found. Run `rake test` before running `rake coverage`."
else
xml_report_str = xml_reports.join(' ')
diff_html_path = report_dir_path('diff_coverage_combined.html')
# Generate the diff coverage reports (HTML and console)
sh("diff-cover #{xml_report_str} --html-report #{diff_html_path}")
sh("diff-cover #{xml_report_str}")
puts "\n"
end
end
# Other Rake files append additional tests to the main test command.
desc "Run all unit tests"
task :test, [:test_id] => 'test:python'