knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE )
The mrgvalprep
package contains helper functions for gathering, formatting, and preprocessing input data for mrgvalidate
. The mrgvalidate
package (as of the 2.0.0
release) is used to generate 7 specific documents that are necessary for the software validation process at Metrum Research Group. Those documents are:
release-notes.docx
validation-plan.docx
testing-plan.docx
requirements-specification.docx
traceability-matrix.docx
testing-results.docx
validation-summary.docx
This vignette demonstrates some of the primary functionality for using mrgvalprep
to validate an R package and build validation docs from User Stories and Requirements defined in YAML files.
library(mrgvalprep) library(mrgvalidate)
mrgvalidate
inputsmrgvalidate
requires two primary inputs:
.csv
and .json
files, described below)These inputs must be in the format described in ?mrgvalidate::input_formats. The purpose of mrgvalprep
is to take test outputs and stories from a variety of formats and transform them into the format that mrgvalidate
expects.
Below we show an example of how to do this using User Stories and Requirements defined in YAML files. Note that there are several other formats that are supported for defining Stories and Requirements. However, these are no longer used at MetrumRG. You can find examples of those in the "Legacy Input Formats" vignette.
This example shows how to validate software that uses R's testthat
framework. The full code (replicated in each section below) is included here for ease of reference. See below for details about each of these functions and their inputs.
# run automated test suite devtools::test(reporter = testthat::ListReporter) %>% # run testthat tests suite mrgvalprep::parse_testthat_list_reporter() %>% # parse test results to tibble readr::write_csv("test_results/package_tests.csv") # write tibble for .csv file # capture system information for test suite run get_sys_info( out_path = "test_results/package_tests.json", env_vars = c("METWORX_AMI_VERSION"), # optionally pull with Sys.getenv() and include in .json sys_info = TRUE # optionally write results of Sys.info() to .json ) # pull stories and requirements from YAML files in package repo spec_df <- mrgvalprep::read_spec_yaml( "inst/validation/stories.yaml", "inst/validation/requirements.yaml" ) # create validation documents mrgvalidate::create_package_docs( "fake.package", # name of the package you are validating "vFake", # version number for this validation (to be printed in docs) language = "R", # can be either "R" or "Go" "github.com/user/package", # URL of associated git repository spec_df, # tibble of stories and requirements "release_notes.md", # path to a Markdown file with release notes auto_test_dir = "auto_tests", # dir containing .csv and .json files for automated test outputs output_dir = "some_dir_for_docs" # dir to write validation docs into )
This section shows how to include the results of automated tests in your validation documents.
The format required for automated test outputs is described in ?mrgvalidate::input_formats.
Note that mrgvalidate
can accept test outputs from an arbitrary number of test suites for a single set of validation documents. If you have more than one relevant test suite, simply repeat the steps below for each suite and include the .csv
and .json
files for all of them in the same directory.
testthat
outputsCurrently, mrgvalprep
has formatters for R's testthat
package (parse_testthat_list_reporter()
), as well as Go's go test --json
output (parse_golang_test_json()
). Both functions return a tibble that conforms to ?mrgvalidate::input_formats.
To create test outputs from an R package using testthat
, navigate to your package directory and run to following.
devtools::test(reporter = testthat::ListReporter) %>% # run testthat tests suite mrgvalprep::parse_testthat_list_reporter() %>% # parse test results to tibble readr::write_csv("test_results/package_tests.csv") # write tibble for .csv file
This will run your full test suite, format the output appropriately, and then write the formatted output to a .csv
for mrgvalidate::create_package_docs()
to consume.
For these tests to be mapped to the Stories described below, they will need to contain Test Id's. This is simply a string that uniquely identifies each test. These Id's will look like ABC-XYZ-001
and contain the following three pieces, separated by a hypen (-
):
CFG
for "configuration")These must be included, with square brackets, in the Test Name of any test that will be mapped to a Story. For example:
test_that("feature X works correctly [MRGV-CFG-001]", { # test code })
In this case, MRGV-CFG-001
will automatically be parsed out by parse_testthat_list_reporter()
and will be matched against any Stories or Requirements containing MRGV-CFG-001
in the TestIds
column described below.
Note that more than one test can share the same test ID, though you will need to pass roll_up_ids = TRUE
to parse_testthat_list_reporter()
See the documentation for the relevant parsing function above for more details.
It is typically necessary to capture some system information about where and when the tests were run. This is passed to mrgvalidate::create_package_docs()
via a .json
file that can be easily created with get_sys_info()
.
get_sys_info( out_path = "test_results/package_tests.json", env_vars = c("METWORX_AMI_VERSION"), # optionally pull with Sys.getenv() and include in .json sys_info = TRUE # optionally write results of Sys.info() to .json )
Note: mrgvalidate::create_package_docs()
will expect to find a .csv
and .json
with the same basename for each test suite, so be sure that what you pass to create_sys_info(out_path)
matches the .csv
of test ouputs that you wrote in the previous section.
The validation process typically requires defining User Stories that capture the promised functionality of the software, and mapping them to tests that verify this functionality. The easist way to do this with mrgvalidate
is by keeping your Stories (and optionally accompanying Technical Requirements) in YAML files, version controlled in the same repository as the actual code, and read in directly using read_spec_yaml()
.
The format of these files is described in the read_spec_yaml()
documentation. At a high-level, the Stories file should have entries formatted like so:
STORY-ID-001: name: Story name description: > Longer story description requirements: - REQ-ID-001 - REQ-ID-002 ProductRisk: risk
While Stories can be mapped directly to tests, it is often useful to instead map them to associated Technical Requirements, which are then mapped to specific tests. To do this, include a second YAML file, with entries formatted like so:
REQ-ID-001: description: > Description tests: - TEST-ID-001 - TEST-ID-001
These Requirements will be included, bullet-pointed, under the relevant Stories in the resulting requirements-specification.docx
document.
Calling read_spec_yaml()
will pull the data in your files into a tibble that can be passed directly to mrgvalidate::create_package_docs()
.
# pull stories and requirements from YAML files in package repo spec_df <- mrgvalprep::read_spec_yaml( "inst/validation/stories.yaml", "inst/validation/requirements.yaml" )
Now that you have test outputs and a tibble of Stories and Requirements, you are ready to generate your validation documents. This is done with mrgvalidate::create_package_docs()
.
You will have .csv
and .json
files of automated test outputs, from your validate_tests()
call above, in the auto_tests
directory, as well as .md
capturing your manual tests in the man_tests
directory. Simply pass these paths, along with your tibble of Stories, into mrgvalidate::create_package_docs()
.
mrgvalidate::create_package_docs( "fake.package", # name of the package you are validating "vFake", # version number for this validation (to be printed in docs) language = "R", # can be either "R" or "Go" "github.com/user/package", # URL of associated git repository spec_df, # tibble of stories and requirements "release_notes.md", # path to a Markdown file with release notes auto_test_dir = "auto_tests", # dir containing .csv and .json files for automated test outputs output_dir = "some_dir_for_docs" # dir to write validation docs into )
This will write out the seven .docx
files, mentioned above, into the directory passed to output_dir
.
If these documents look correct after human inspection, you're done!
Formatting note: It is possible to pass .docx
"style reference templates" via the style_dir
argument to mrgvalidate::create_package_docs()
. This can be used to control the formatting, as well as to add a custom header and footer to all of your documents.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.