python: Fix identification of runnable tests within decorated test classes (#29688)

Closes #29486

Release Notes:

- python: Fixed identification of runnable test functions within
decorated pytest classes
This commit is contained in:
Ben Kunkle 2025-04-30 13:26:30 -04:00 committed by GitHub
parent 4d934f2884
commit d03d8ccec1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,12 +4,12 @@
name: (identifier) @run @_unittest_class_name name: (identifier) @run @_unittest_class_name
superclasses: (argument_list superclasses: (argument_list
[(identifier) @_superclass [(identifier) @_superclass
(attribute (identifier) @_superclass)] (attribute (identifier) @_superclass)]
) )
(#eq? @_superclass "TestCase") (#eq? @_superclass "TestCase")
) @_python-unittest-class ) @_python-unittest-class
(#set! tag python-unittest-class) (#set! tag python-unittest-class)
) )
; test methods whose names start with `test` in a TestCase ; test methods whose names start with `test` in a TestCase
( (
@ -17,18 +17,18 @@
name: (identifier) @_unittest_class_name name: (identifier) @_unittest_class_name
superclasses: (argument_list superclasses: (argument_list
[(identifier) @_superclass [(identifier) @_superclass
(attribute (identifier) @_superclass)] (attribute (identifier) @_superclass)]
) )
(#eq? @_superclass "TestCase") (#eq? @_superclass "TestCase")
body: (block body: (block
(function_definition (function_definition
name: (identifier) @run @_unittest_method_name name: (identifier) @run @_unittest_method_name
(#match? @_unittest_method_name "^test.*") (#match? @_unittest_method_name "^test.*")
) @_python-unittest-method ) @_python-unittest-method
(#set! tag python-unittest-method) (#set! tag python-unittest-method)
) )
) )
) )
; pytest functions ; pytest functions
( (
@ -36,10 +36,10 @@
(function_definition (function_definition
name: (identifier) @run @_pytest_method_name name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_") (#match? @_pytest_method_name "^test_")
) @_python-pytest-method ) @_python-pytest-method
) )
(#set! tag python-pytest-method) (#set! tag python-pytest-method)
) )
; decorated pytest functions ; decorated pytest functions
( (
@ -53,7 +53,8 @@
) @_python-pytest-method ) @_python-pytest-method
) )
(#set! tag python-pytest-method) (#set! tag python-pytest-method)
) )
; pytest classes ; pytest classes
( (
@ -61,10 +62,26 @@
(class_definition (class_definition
name: (identifier) @run @_pytest_class_name name: (identifier) @run @_pytest_class_name
(#match? @_pytest_class_name "^Test") (#match? @_pytest_class_name "^Test")
) )
(#set! tag python-pytest-class) (#set! tag python-pytest-class)
)
) )
)
; decorated pytest classes
(
(module
(decorated_definition
(decorator)+ @_decorator
definition: (class_definition
name: (identifier) @run @_pytest_class_name
(#match? @_pytest_class_name "^Test")
)
)
(#set! tag python-pytest-class)
)
)
; pytest class methods ; pytest class methods
( (
@ -73,35 +90,49 @@
name: (identifier) @_pytest_class_name name: (identifier) @_pytest_class_name
(#match? @_pytest_class_name "^Test") (#match? @_pytest_class_name "^Test")
body: (block body: (block
(function_definition [(decorated_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test")
) @_python-pytest-method
(#set! tag python-pytest-method)
)
)
)
)
; decorated pytest class methods
(
(module
(class_definition
name: (identifier) @_pytest_class_name
(#match? @_pytest_class_name "^Test")
body: (block
(decorated_definition
(decorator)+ @_decorator (decorator)+ @_decorator
definition: (function_definition definition: (function_definition
name: (identifier) @run @_pytest_method_name name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_") (#match? @_pytest_method_name "^test_")
) )
) )
) @_python-pytest-method (function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test")
)
] @_python-pytest-method)
(#set! tag python-pytest-method) (#set! tag python-pytest-method)
)
)
)
; decorated pytest class methods
(
(module
(decorated_definition
(decorator)+ @_decorator
definition: (class_definition
name: (identifier) @_pytest_class_name
(#match? @_pytest_class_name "^Test")
body: (block
[(decorated_definition
(decorator)+ @_decorator
definition: (function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test_")
)
)
(function_definition
name: (identifier) @run @_pytest_method_name
(#match? @_pytest_method_name "^test")
)
] @_python-pytest-method)
(#set! tag python-pytest-method)
)
)
) )
) )
)
; module main method ; module main method
( (
@ -111,10 +142,10 @@
(identifier) @run @_lhs (identifier) @run @_lhs
operators: "==" operators: "=="
(string) @_rhs (string) @_rhs
) )
(#eq? @_lhs "__name__") (#eq? @_lhs "__name__")
(#match? @_rhs "^[\"']__main__[\"']$") (#match? @_rhs "^[\"']__main__[\"']$")
(#set! tag python-module-main-method) (#set! tag python-module-main-method)
)
) )
) )
)