- OS: XXX
- Python
- Distribution: XXX
- Version: XXX
- VS Code: XXX
ALWAYS:
- Check the
Outputwindow underPythonfor logged errors - Have
Developer Toolsopen to detect any errors - Consider running the tests in a multi-folder workspace
Scenarios
- Interpreter is shown in the status bar
- An interpreter can be manually specified using the
Select Interpretercommand - Detected system-installed interpreters
- Detected an Anaconda installation
- (Linux/macOS) Detected all interpreters installed w/ pyenv detected
-
"python.pythonPath"triggers an update in the status bar -
Run Python File in Terminal -
Run Selection/Line in Python Terminal- Right-click
- Command
-
Ctrl-Enter
ALWAYS:
-
Use the latest version of Anconda
-
Create an environment with a space in their path somewhere
-
Make sure that you do not have
python.pythonPathspecified in yoursettings.jsonwhen testing automatic detection -
Do note that the
Select Interpreterdrop-down window scrolls -
Detected a single virtual environment at the top-level of the workspace folder (if you created this after opening VS Code, then run
Reload Windowto pick up the new environment)- Appropriate suffix label specified in status bar (e.g.
(venv)) -
Create Terminalworks- Steals focus
-
"python.terminal.activateEnvironment": falsedeactivates automatically running the activation script in the terminal
- Appropriate suffix label specified in status bar (e.g.
-
Detect multiple virtual environments in a directory specified by
"python.venvPath" -
Detected all conda environments created with an interpreter
- Appropriate suffix label specified in status bar (e.g.
(condaenv)) - Prompted to install Pylint
- Asked whether to install using conda or pip
- Installs into environment
-
Create Terminalworks-
"python.terminal.activateEnvironment": falsedeactivates automatically running the activation script in the terminal
-
- Appropriate suffix label specified in status bar (e.g.
-
(Linux/macOS until
-mis supported) Detected the virtual environment created by pipenv- Appropriate suffix label specified in status bar (e.g.
(pipenv)) - Prompt to install Pylint uses
pipenv install --dev -
Create Terminalworks-
"python.terminal.activateEnvironment": falsedeactivates automatically running the activation script in the terminal
-
- Appropriate suffix label specified in status bar (e.g.
-
(Linux/macOS) Virtual environments created under
{workspaceFolder}/.direnv/python-{python_version}are detected (for direnv and itslayout python3support)- Appropriate suffix label specified in status bar (e.g.
(venv))
- Appropriate suffix label specified in status bar (e.g.
Sample files:
# example.py
import os
print('Hello,', os.environ.get('WHO'), '!')# .env
WHO=world
PYTHONPATH=some/path/somewhere
ALWAYS:
-
Make sure to use
Reload Windowbetween tests to reset your environment -
Note that environment files only apply under the debugger and Jedi
-
Environment variables in a
.envfile are exposed when running under the debugger -
"python.envFile"allows for specifying an environment file manually (e.g. Jedi picks upPYTHONPATHchanges) -
envFilein alaunch.jsonconfiguration works
-
pythonPathsetting in yourlaunch.jsonoverrides yourpython.pythonPathdefault setting
ALWAYS:
- Check under the
Problemstab to see e.g. if a linter is raising errors
[Prompting to install Pylint is covered under Environments above]
For testing the disablement of the default linting rules for Pylint:
# pylintrc
[MESSAGES CONTROL]
enable=bad-names# example.py
foo = 42 # Marked as a blacklisted name.- Installation via the prompt installs Pylint as appropriate
- Uses
--userfor system-install of Python - Installs into a virtual environment environment directly
- Uses
- Pylint works
-
"python.linting.pylintUseMinimalCheckers": falseturns off the default rules w/ nopylintrcfile present - The existence of a
pylintrcfile turns off the default rules
Note:
-
You can use the
Run Lintingcommand to run a newly installed linter -
When the extension installs a new linter, it turns off all other linters
-
flake8 works
-
Select linterlists the linter and installs it if necessary
-
-
mypy works
-
Select linterlists the linter and installs it if necessary
-
-
pep8 works
-
Select linterlists the linter and installs it if necessary
-
-
prospector works
-
Select linterlists the linter and installs it if necessary
-
-
pydocstyle works
-
Select linterlists the linter and installs it if necessary
-
-
pylama works
-
Select linterlists the linter and installs it if necessary
-
-
3 or more linters work simultaneously (make sure you have turned on the linters in your
settings.json)-
Run Lintingruns all activated linters -
"python.linting.enabled": falsedisables all linters - The
Enable Lintingcommand changes"python.linting.enabled"
-
-
"python.linting.lintOnSaveworks
Please also test for general accuracy on the most "interesting" code you can find.
-
"python.autoComplete.extraPaths"works -
"python.autoComplete.preloadModules"works (e.g. listingnumpyshould visibly speed up completing on the module's contents) -
"python.autocomplete.addBrackets": truecauses auto-completion of functions to append()
Sample file:
# There should be _some_ change after running `Format Document`.
def foo():pass- Prompted to install a formatter if none installed and
Format Documentis run- Installing
autopep8works - Installing
yapfworks
- Installing
- autopep8 works
- yapf works
-
"editor.formatOnType": trueworks and has expected results
-
Extract Variableworks- You are prompted to install
ropeif it is not already available
- You are prompted to install
-
Extract methodworks- You are prompted to install
ropeif it is not already available
- You are prompted to install
-
Sort Importsworks
ALWAYS:
-
Test the current debugger
-
Text the experimental debugger (and note whether it is at least as fast as the old debugger)
-
Configurations work
-
Current File -
Module -
Attach -
Terminal (integrated) -
Terminal (external) -
Django -
Flask -
Pyramid -
Watson -
Scrapy -
PySpark -
All debug Optionswith appropriate values edited to make values valid
-
-
Breakpoints
- Set
- Hit
- Conditional
- Expression
- Hit count
- Log points (experimental debugger only)
-
Stepping
- Over
- Into
- Out
-
Can inspect variables
- Through hovering over variable in code
-
Variablessection of debugger sidebar
-
Remote debugging works
- ... over SSH
import unittest
class PassingTests(unittest.TestCase):
def test_passing(self):
self.assertEqual(42, 42)
def test_passing_still(self):
self.assertEqual("silly walk", "silly walk")
class FailingTests(unittest.TestCase):
def test_failure(self):
self.assertEqual(42, -13)
def test_failure_still(self):
self.assertEqual("I'm right!", "no, I am!")-
Run All Unit Teststriggers the prompt to configure the test runner - Tests are discovered (as shown by code lenses on each test)
def test_passing():
assert 42 == 42
def test_failure():
assert 42 == -13-
Run All Unit Teststriggers the prompt to configure the test runner-
pytestgets installed
-
- Tests are discovered (as shown by code lenses on each test)
def test_passing():
assert 42 == 42
def test_failure():
assert 42 == -13-
Run All Unit Teststriggers the prompt to configure the test runner- Nose gets installed
- Tests are discovered (as shown by code lenses on each test)
- Code lenses appears
-
Run Testlens works (and status bar updates as appropriate) -
Debug Testlens works - Appropriate ✔/❌ shown for each test
-
- Status bar is functioning
- Appropriate test results displayed
-
Run All Unit Testsworks -
Discover Unit Testsworks (resets tests result display in status bar) -
Run Unit Test Method ...works -
View Unit Test Outputworks - After having at least one failure,
Run Failed Testsworks