DEV Community

Raj Shekhar Dev
Raj Shekhar Dev

Posted on

Custom Tasks in VSCode

As a PHP(mostly Laravel) developer, I tend to quickly test my code with phpunit command. The inbuilt terminal in VSCode thus becomes very essential but it takes time and multiple keypresses to open the terminal, run the command and then close it. Here the custom tasks provided by VSCode comes handy. Let's have a look:

Create a .vscode folder in the root directory and tasks.json file in it.

Example: 1

To run the complete test suite we use the following command:

$ vendor/bin/phpunit
Enter fullscreen mode Exit fullscreen mode

Let's put our first task. Open the tasks.json file and add:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Run all tests",
            "type": "shell",
            "command": "vendor/bin/phpunit",
            "group": "test",
            "presentation": {
                "reveal" : "always",
            }
        },
    ]
}
Enter fullscreen mode Exit fullscreen mode

Here's a quick rundown of the properties of the objects inside the tasks array:

  • label: Name of the command; Keep it according to your needs
  • type: Type of the command; other options include npm
  • command: The actual command to be executed
  • group: Optional; It is good to group similar type to commands
  • presentation: The state of the task runner(terminal) while and after running the test.

To run the test: ctrl+shift+P, search Run task, press enter, find the task Run all tests and BOOM!!

ctrl+shft+P
Run Task
Terminal

Example: 2

To run tests from the current or specified filename/class, we use:

$ vendor/bin/phpunit --filter=EmailTest
Enter fullscreen mode Exit fullscreen mode

Here the filename changes and thus we cannot hardcode it. Here vscode predefined variable comes handy. In the same tasks.json file, add the following object in the tasks array

{
    "label": "Run test for current file",
    "type": "shell",
    "command": "vendor/bin/phpunit --filter=${fileBasenameNoExtension}",
    "group": "test",
    "presentation": {
        "reveal": "always",
    }
}
Enter fullscreen mode Exit fullscreen mode

Here ${fileBasenameNoExtension} will take up the current filename without an extension from which you are running the test.

References:

BONUS: You can assign each of your tasks to a keybinding and further smooth out the workflow.

Top comments (0)