Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)
like image 732
daino3 Avatar asked Jul 23 '17 16:07

daino3


1 Answers

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.

like image 156
Piotr Dawidiuk Avatar answered Sep 28 '22 03:09

Piotr Dawidiuk