2022-11-14
David Granjon, Novartis
Senior Software developer at Novartis.
We’re in for 2 hours of fun!
Clone this repository with the RStudio IDE or via the command line.
Then run renv::restore()
to install the dependencies.
If you want to run {shinyValidator}
locally (not on CI/CD), you must have:
shinycannon
installed for the load-test part. See here.
A chrome browser installed like chromium.
git
installed and a GitHub account.
A recent R version, if possible R>= 4.1.0
.
Your app may be as beautiful and as cool as you want, it is useless if it does not start/run.
How do we transition❓
Reliable : is the app doing what it is intended to do?
Stable : how often does it crash?
Available : is the app fast enough to handle multiple concurrent users?
In practice, a few apps meet all these requirements 😈.
Are there bottlenecks?
Not easy 😢
Can’t we make things easier❓
We create an empty golem project1:
We add some useful files, basic test and link to git:
Browse to GitHub and create an empty repository called <PKG>
matching the previously created package.
Go to terminal tab under RStudio:
Initialize renv for R package dependencies:
Review the file structure
%%{init: {'theme':'dark'}}%% flowchart TD subgraph CICD direction TB subgraph DMC direction LR E[Lint] --> F[Quality] F --> G[Performance] end subgraph POC direction LR H[Lint] --> I[Quality] end end A(Shiny Project) --> B(DMC App) A --> C(Poof of concept App POC) B --> |strict| D[Expectations] C --> |low| D D --> CICD CICD --> |create| J(Global HTML report) J --> |deploy| K(Deployment server) click A callback "Tooltip for a callback" click B callback "DMC: data monitoring committee" click D callback "Apps have different expectations" click E callback "Lint code: check code formatting, style, ..." click F callback "Run R CMD check + headless crash test (shinytest2)" click G callback "Optional tests: profiling, load test, ..." click J callback "HTML reports with multiple tabs" click K callback "RStudio Connect, GitLab/GitHub pages, ..."
audit_app()
is the main function 1:
run_app()
such as database logins, …
%%{init: {'theme':'dark'}}%% graph TD A(Check) --> B(Crashtest) B --> C(Loadtest) C --> D(Coverage) D --> E(Reactivity) click A callback "devtools::check" click B callback "{shinytest2}" click C callback "{shinyloadtest}" click D callback "{covr}" click E callback "{reactlog}"
This code is run during crash test, profiling and reactivity check.
Run the following code step by step1:
# Start the app
library(shinytest2)
headless_app <- AppDriver$new("./app.R")
# View the app for debugging (does not work from Workbench!)
headless_app$view()
headless_app$set_inputs(obs = 1)
headless_app$get_value(input = "obs")
# You can also run JS code!
headless_app$run_js(
"$('#obs')
.data('shiny-input-binding')
.setValue(
$('#obs'),
100
);
"
)
# Now you can call any function
# Close the connection before leaving
headless_app$stop()
run_crash_test()
runs a gremlins.js
test if no headless action are passed:
./app.R
in an external browser.shinyValidator::audit_app(scope = "POC")
.public/index.html
(external browser).Cleanup between each run!
Your turn 🎮
Modify shinyValidator::audit_app
parameters:
Run shinyValidator::audit_app
and have a look at the coverage tab.
Leverage shinytest2 power1, app
being the Shiny app to audit.
Run the above code and have a look at the screenshots.
Create this function in helpers.R
:
Add it to app_server.R
:
Enable output check in shinyValidator::audit_app
:
Create a new test:
Modify the custom headless script by adding a timeout:
Run shinyValidator::audit_app
and have a look at the profiling tab.
In case you need to control branches triggering {shinyValidator}
:
If you have to change the R version, os, …:
- name: Lint code
shell: Rscript {0}
run: shinyValidator::lint_code()
- name: Audit app 🏥
shell: Rscript {0}
run: shinyValidator::audit_app()
- name: Deploy to GitHub pages 🚀
if: github.event_name != 'pull_request'
uses: JamesIves/github-pages-deploy-action@4.1.4
with:
clean: false
branch: gh-pages
folder: public
Modify GitHub actions yaml file:
Get a top notch app? Try to setup {shinyValidator}
and run it.
CI/CD and testing are not easy!
Follow me on Fosstodon. @davidgranjon@fosstodon.org