DEV Community

Cover image for Streamlined PHPUnit Testing within Docker using the neotest-docker-phpunit Plugin
Brainvault Technologies
Brainvault Technologies

Posted on

Streamlined PHPUnit Testing within Docker using the neotest-docker-phpunit Plugin

Why Use Neotest Docker PHPUnit?

Neovim's neotest plugin provides an exceptional API and user interface for effortlessly running unit tests directly from your editor. However, the current neotest-phpunit adapter lacks the capability to execute tests within Docker containers, limiting its functionality.
This poses a significant challenge for projects heavily dependent on Dockerized environments. However, neotest-docker-phpunit acts as a vital link, enabling seamless execution of PHPUnit tests directly within the Docker container.

Challenges and Solutions
A primary hurdle lies in the prevalent usage of Docker Compose for orchestrating containerized environments in many projects. Moreover, standalone containers are another common scenario. Additionally, discrepancies in the working directory between the container and the host machine further compound the challenge.
Neotest-docker-phpunit tackles these challenges by creating a simple command-line tool (CLI). This CLI interacts with Docker and PHPUnit to achieve the following:

Test Execution: Utilizing the established neotest-phpunit adapter for its core operations, preventing unnecessary duplication of efforts.
Result Exportation: As the tests are conducted within the container, the resultant report file (log-junit) must be transferred to the host machine to enable Neovim's parsing and visualization of outcomes.
Path Conversion: Test results typically include container-based paths, necessitating translation into their respective host machine paths before Neovim can render them accurately.
The CLI offers various options for tailoring this process to your needs.

- - container: Define the Docker container name for executing your tests.

- - standalone:Specify whether Docker Compose is utilized or if it's a standalone container setup.

- - volume:Map the working directory from your host machine to the container, mirroring the functionality of the docker volume command.

You can deploy the CLI tool via Cargo.

Cargo install neotest-docker-phpunit
Utilizing the Neovim Plugin

The neotest-docker-phpunit plugin harmoniously merges with Neovim's neotest plugin, extending its capabilities. It seamlessly incorporates all existing configuration options from both plugins while introducing specific enhancements:

  • Tailored Working Directories: Configure distinct working directory mappings for individual projects, accommodating potential variations in their container paths.

  • Default Settings: Establish a default configuration tailored to common scenarios, simplifying the initial setup process for smoother integration.

  • Example ConfigurationThe provided Lua code snippet demonstrates how to configure neotest-docker-phpunit within your Neovim configuration:

Lua

require('neotest').setup({
  adapters = {
    -- require('neotest-pest'),  -- (Optional) Add other adapters if needed
    require('neotest-docker-phpunit').setup({
      phpunit_cmd = "neotest-docker-phpunit",  -- Specify the path to your CLI tool
      "/path/to/other/project/" = {  -- Configuration for a specific project directory
        default = {
          container = "phpunit",  -- Name of the container running your tests
          volume = "/path/to/other/project/:/path/to/container/path",  -- Map working directory
          standalone = true,  -- Indicate standalone container usage
        }
      },
      docker_phpunit = {  -- Default configuration for other projects
        default = {
          container = "php",  -- Default container name
          volume = "/path/to/your/project/:/path/to/container/path",  -- Default working directory mapping
          -- You can optionally customize further using a callback function
          callback = function (spec, arg)
            return spec
          end
        }
      }
    }),
    require("neotest-go"),  -- (Optional) Add other adapters if needed
  },
  diagnostic = {
    enabled = true
  }
})



Enter fullscreen mode Exit fullscreen mode

This setup empowers you to harness the capabilities of Neovim's neotest plugin, enabling seamless execution of PHPUnit tests directly within your Docker containers. This integration optimizes your development workflow for enhanced efficiency and productivity.

Author Credit: Mohan Raj โ€” Software Engineer

Top comments (0)