Python test fixture to run a single test?

2020-04-07 06:11发布

问题:

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)

回答1:

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):
    ...