For software companies serving clinical research teams, speed and reliability matter at every stage. When testing slows down, the impact reaches beyond the engineering team. Releases become harder to plan, developers wait longer for feedback, and QA teams spend more time preparing systems than testing the product.
In this case study, we will explore how CRIO introduced a dynamic QA automation environment for its SiteApp services. We will look at the approach used to automate infrastructure setup, database creation, application deployment, testing, and cleanup. We will also examine how the new workflow supported parallel testing, faster feedback, and more consistent QA environments.

CRIO provides clinical research software for research sites, sponsors, and contract research organizations. Its platform supports the key activities involved in running and monitoring clinical trials.
For a software company serving clinical research teams, application quality and reliability are essential. Development teams must test every change carefully without slowing planned releases. When testing environments are difficult to access or prepare, developers wait longer for feedback, QA teams spend more time on setup, and release planning becomes less predictable.
But they were facing a lot of issues.
After reviewing CRIO’s QA process, we proposed a fully automated approach that would address each bottleneck while making testing faster, more consistent, and easier to scale.
After implementing the automated QA environment, CRIO saw clear improvements in testing speed, team productivity, environment consistency, and resource management.
Step 1: Build the Automated Workflow
We first designed a GitHub Actions workflow that started when code was merged into the release branch. The workflow assigned a unique identifier to every execution and passed it across database, namespace, deployment, and testing tasks. This naming strategy prevented parallel runs from overwriting resources. We also added clear job dependencies so infrastructure was created in the correct order and failures stopped later steps from using incomplete resources.
Step 2: Create and Seed an Isolated Database
Next, we automated the creation of a dedicated Cloud SQL database for each test run and loaded it with seeded test data. Unique database names prevented parallel environments from sharing or changing the same data. We considered creation failures, incomplete seeding, and connection delays. The workflow checked each stage before continuing, ensuring SiteApp services received a ready, consistent database instead of starting against a partially prepared system.
Step 3: Deploy SiteApp Services in a Unique Namespace
After the database was ready, we generated a unique Kubernetes namespace and deployed the SiteApp services through Helm and Argo CD. The namespace isolated each execution, allowing two or three environments to run without service, configuration, or networking conflicts. We kept deployment values consistent while supplying run-specific names and database settings. Readiness checks prevented tests from starting before pods became healthy and producing false failures.
Step 4: Run Tests and Publish Results
Once the services passed readiness checks, the workflow launched the Playwright QA automation tests and collected the results. Tests ran against the isolated environment created for that execution, reducing interference from other teams or feature branches. We published the test output so developers could review failures without searching through deployment logs. Test failures did not immediately destroy the environment, giving teams time to inspect services, logs, and data.
Step 5: Retain and Clean Up Temporary Resources
Finally, we implemented retention and cleanup workflows for temporary databases and Kubernetes namespaces. Each environment remained available for 24 hours to support additional validation, while database cleanup followed the configured retention period, with seven days as the default. Cleanup had to remain reliable because failed or cancelled workflows could leave resources behind. Unique identifiers and age-based checks targeted only temporary resources, reducing the risk of deleting permanent infrastructure.
This case study showed how CRIO moved from limited shared QA environments to a faster, automated testing process. ThinkSys helped design and implement a workflow that handled infrastructure setup, database creation, SiteApp deployment, Playwright testing, and cleanup with minimal manual effort. Many software companies face similar delays when teams depend on shared environments and manual deployments. ThinkSys can help remove these bottlenecks with scalable QA automation built around each business’s tools and needs. Contact ThinkSys to create a more reliable and efficient testing process.