Let's Actually Make A Test (For Real)
Overview
Teaching: 5 min
Exercises: 25 minQuestions
I’m out of questions.
I’ve been here too long. Mr. Stark, I don’t feel too good.
Objectives
Actually add a test on the output of running physics
So at this point, I’m going to be very hands-off, and just explain what you will be doing.
Adding a regression test
- Add a
teststage after therunstage.- Add a
test_exoticsjob that is part of theteststage, and depends onrun_exotics.
- this job does not need to clone the repository (change
GIT_STRATEGY)- Create a python file named
test_regression.pythat usesPyROOTandpytest
- you might find the following lines (below) helpful to get
pytestin the analysisbase image- you might find the following lines (below) helpful to set up
test_regression.py- Write a few different tests of your choosing that tests (and asserts) something about
myOuputFile.root. Some ideas are:
- check the structure (does
h_njets_rawexist?)- check that the integral of a histogram matches a value you expect
- check that the bins of a histogram matches the values you expect
- Update your
test_exoticsjob to executepytest test_regression.py- Try causing your CI/CD to fail on the
test_exoticsjobDone?
Once you’re happy with setting up the regression test, mark your merge request as ready by clicking the
Resolve WIP Statusbutton, and then merge it in to master.
PyTest in AB Image
pip install --user pytest
export PATH=/home/atlas/.local/bin:$PATH
Template for test_regression.py
import pytest
import ROOT
@pytest.fixture(scope='module')
def root_file():
""" A module fixture is used to open the ROOT file once for this entire
module and then close it when we're done.
"""
f = ROOT.TFile.Open('run/myOutputFile.root')
yield f
f.Close()
def test_file_structure(root_file):
pass
def test_histogram_integral(root_file):
pass
def test_histogram_bins(root_file):
pass
Key Points
This kind of test is a regression test, as we’re testing assuming the code up to this point was correct.
This is not a unit test. Unit tests would be testing individual pieces of the
atlas/athenacode-base, or specific functionality you wrote into your algorithms.