nose icon indicating copy to clipboard operation
nose copied to clipboard

Regular expression -m filter needs more helpful documentation

Open purplefishies opened this issue 7 years ago • 3 comments

I'm using nosetests1.3.7 on Ubuntu 16.10

I have a simple directory structure as follows

controller/controller.py tests/test_ethernet.py

which looks like

class TestEthernet(unittest.TestCase):

def setUp(self):
    print("Running setup")

def test_setup(self):
    self.assertEqual(1,1)
    print("Here")
    time.sleep(0.4)
    self.assertEqual(1,2)

def test_other(self):
    self.assertEqual(1,1)
    print("There")

If I run the default regular expression on the command line I see

nosetests -v  -m "(?:^|[\b_\./-])[Tt]est." --collect-only
test_other (tests.test_ethernet.TestEthernet) ... ok
test_setup (tests.test_ethernet.TestEthernet) ... ok

So, I'm expecting logically , that if i run a regular expression that includes only the case insensitive version of "ethernet" in it that it would match. Nope

Example 1.

nosetests -v  -m ".*[Ee][tT][Hh][Ee][Rr][Nn][Ee][Tt].*" --collect-only 

----------------------------------------------------------------------
Ran 0 tests in 0.001s

OK

Your logic for how your -m regular expression is not obvious to the user.

Example 2.

nosetests -v  -m "(?:^|[\b_\./-])[Tt]est_[e-s]" --collect-only 
test_other (tests.test_ethernet.TestEthernet) ... ok
test_setup (tests.test_ethernet.TestEthernet) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

However, I don't know what that last character is matching on. I've tried bisection and [e-s] is the only final character I can use to match the test cases. For instance,

nosetests -v  -m "(?:^|[\b_\./-])[Tt]est_[e-o]"  --collect-only
test_other (tests.test_ethernet.TestEthernet) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

But this regular expression has to match both "test_other" AND "test_ethernet". It seems like a very difficult regex writing system if you have to write a regex that matches ALL of the Files, the function and the class that you want to write. In addition, this requirement makes your documentation even harder to understand for this feature as it doesn't make logical sense compared to other test runner selection regular expression rules ( see Google Test and Ruby's unit test with -n option ) .

It might be easier to just concatenate the FN_NAME ( DIRECTORY:FILE:CLASS) and then apply the regular expression to that line created, for instance you could apply the regex to the line that is generated for --collect-only

ie.

nosetests -v -m "(?:^|[\b_./-])[Tt]est_" --collect-only test_other (tests.test_ethernet.TestEthernet) ... ok test_setup (tests.test_ethernet.TestEthernet) ... ok

Why not have the regular expression match on "test_setup (tests.test_ethernet.TestEthernet)"
so that -m ".ethernet." would match these two, ".*setup.ethernet." would match only test_setup ...etc ?

I've got 20+ years of writing regular expressions and as it is the "-m" option is way too complicated because it is applied as a LOGICAL AND across The filename, Package, functioname and directories.

For instance according to the documentation "Files, directories, function names, and class names that match this regular expression are considered tests." . Hence

-m ".test_setup." matches one function name and should be included in the set of tests that would be run. It doesn't because the regex doesn't match the class that I want to use

nosetests -v  -m ".*test_setup.*"  --collect-only

----------------------------------------------------------------------
Ran 0 tests in 0.001s

OK

No tests found

Google Test is an example of a much easier system for writing these regular expression filters for quicly selecting the test(s) you want to run after running --gtest_list_tests, followed by --gtest_filter="ethernet"

purplefishies avatar Apr 24 '17 21:04 purplefishies

Hi,

I found an example online that solved my problem and allowed me to apply the "-m" filter more appropriately, but I wasn't able to find this documentation on the nosetests utility itself.

example

nosetests -v -m "_other"   tests/*
test_other (tests.test_ethernet.TestEthernet) ... ok
test_other (tests.test_ethernet.TestEthernet) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

Perhaps just including an example that -m FILTER + tests/*.py would go a long way in the documentation to helping people understand how this filter can be applied.

Thanks

purplefishies avatar Apr 24 '17 21:04 purplefishies

@purplefishies +1

I too have found the same problem, as documentation says files, directories, functions or classes, when I give regex for directory it's not obeying it... We need some examples to be included in documentation...

lokesh1729 avatar Jan 14 '19 08:01 lokesh1729

+1 here - fighting nosetests more than code at this stage :(

The tests/* did not work for me (issues with imports)

urban-1 avatar Dec 30 '20 19:12 urban-1