pythonunit-testingpytestnose

Python test fixture to run a single test?


I'm looking for something like ruby rspec's focus metadata or elixir's mix tags to run a single python test.

Ruby RSpec Example:

# $ rspec spec
it 'runs a single test', :focus do 
  expect(2).to eq(2)
end

Elixir ExUnit & Mix Example:

# $ mix test --only focus
@tag :focus
test "only run this test" do
  assert true
end

Is this possible / available with any python test runner and fixture combo? Running single tests by specifying nested module.class.test_name via command line args can become very verbose in larger projects.

So Something like:

Desired Python Code:

# $ nosetests --only focus

from tests.fixtures import focus

class TestSomething(unittest.TestCase):
    @focus
    def test_all_the_things(self):
        self.assertEqual(1, 1)

Solution

  • Say hello to pytest mark. You can create a focus tag, assign to any test case or method and then run tests with pytest -v -m focus command. For example:

    import unittest
    import pytest
    
    class TestOne(unittest.TestCase):
        def test_method1(self):
            # I won't be executed with focus mark
            self.assertEqual(1, 1)
    
        @pytest.mark.focus
        def test_method2(self):  
            # I will be executed with focus mark          
            self.assertEqual(1, 1)
    

    will run test_method2. To run all methods within some TestCase, you simply mark a class:

    import unittest
    import pytest
    
    @pytest.mark.focus
    class TestOne(unittest.TestCase):
        ...
    

    You will need to register your custom marks in pytest.ini like

    [pytest]
    markers =
        focus: what is being developed right now
    

    To see the available marks, run pytest --markers.