[Avocado-devel] [RFC] Recursive Test Discovery [V2]

Lukáš Doktor ldoktor at redhat.com
Wed Jun 7 12:47:16 UTC 2017


Dne 7.6.2017 v 09:15 Lukáš Doktor napsal(a):
> Dne 7.6.2017 v 00:35 Jeff Nelson napsal(a):
>> On Fri, 2 Jun 2017 09:26:32 +0200
>> Amador Pahim <apahim at redhat.com> wrote:
>>
>>> Motivation
>>> ==========
>>>
>>> Currently we can discover test classes that does not inherit directly
>>> from `avocado.Test`. To do so, we rely on the inclusion of a docstring
>>> (`:avocado: enable`) in the mentioned class. Example below.
>>>
>>> File `/usr/share/avocado/tests/test_base_class.py`::
>>>
>>>      from avocado import Test
>>>
>>>
>>>      class BaseClass(Test):
>>>
>>>          def test_basic(self):
>>>              pass
>>>
>>> File `/usr/share/avocado/tests/test_first_child.py`::
>>>
>>>      from test_base_class import BaseClass
>>>
>>>
>>>      class FirstChild(BaseClass):
>>>          """
>>>          :avocado: enable
>>>          """
>>>
>>>          def test_first_child(self):
>>>              pass
>>>
>>> In the example above, if we ask Avocado to list the tests from
>>> `test_first_child.py`, `FirstChild.test_first_child` will be listed and
>>> the `BaseClass.test_basic` won't::
>>>
>>>      $ avocado list test_first_child.py
>>>      INSTRUMENTED test_first_child.py:FirstChild.test_first_child
>>>
>>> The request is that, in such cases, we have a way to include the
>>> `BaseClass.test_basic` into the results.
>>>
>>> Proposal
>>> ========
>>>
>>> To include the parent classes into the discovery results, we have three
>>> main aspects to consider:
>>>
>>> - How to flag that we want that behaviour?
>>>    The proposal is the creation of a new docstring `recursive`. 
>>> Example::
>>>
>>>      class FirstChild(BaseClass):
>>>          """
>>>          :avocado: recursive
>>>          """
>>>          ...
>>
>> I like everything about this RFC except for the word "recursive,"
>> because I don't think what is being described is a recursive process.
>> Recursion is a technique to "divide a problem into smaller subproblems
>> of the same type." [1] I don't think that's what is happening here.
>> Instead, I imagine this as discovering the class hierarchy in an
>> iterative fashion, from the starting class to the base class.
>>
>> So if I'm not fond of "recursive" what do I think should be used
>> instead? Here is a list of words that I put together, some better than
>> others:
>>
>> * discovery
>> * discover
>> * ancestors
>> * ancestor-discovery
>> * hierarchy
>> * include-hierarchy
>> * inheritance
>> * inheritance-walk
>> * ancestry
>>
Actually `walk` would also work for me... Still I'm in favor of 
`recursive`...

Lukáš

> Well out of those I'd still go with recursive, anyway I'm not native. 
> Recursive to me means do the same process with some data till the end 
> (condition) which is exactly what are we doing. We consider this class 
> avocado and recurs into all ancestors. Basically it's recursive 
> discovery so the word recursive IMO fits.
> 
> Lukáš
> 
> PS: The implementation actually is recursive as it calls the same method 
> to discover the parent classes ;-)
> 
>> It's hard coming up with a descriptive word that describes the process
>> of discovering the classes in the inheritance hierarchy. The word
>> "ancestry" is the term I favor the most.
>>
>> This is not a NACK; maybe it will spark some ideas. If not, that's
>> OK too.
>>
>> -Jeff
>>
>>
>> [1] https://en.wikipedia.org/wiki/Recursion#In_computer_science
>>
>>
>>>
>>> - How deep is the recursion?
>>>    The proposal is that the recursion goes all the way up to the class
>>>    inheriting from `avocado.Test`.
>>>
>>> - Will the recursion respect the parents docstrings?
>>>    The proposal is that the docstrings in the parents are ignored when
>>>    recursively discovering. Example:
>>>
>>>    File `/usr/share/avocado/tests/test_base_class.py`::
>>>
>>>      from avocado import Test
>>>
>>>
>>>      class BaseClass(Test):
>>>          """
>>>          :avocado: disable
>>>          """
>>>
>>>          def test_basic(self):
>>>              pass
>>>
>>>    File `/usr/share/avocado/tests/test_first_child.py`::
>>>
>>>      from test_base_class import BaseClass
>>>
>>>
>>>      class FirstChild(BaseClass):
>>>          """
>>>          :avocado: recursive
>>>          """
>>>
>>>          def test_first_child(self):
>>>              pass
>>>
>>>    Will result in::
>>>
>>>      $ avocado list test_first_child.py
>>>      INSTRUMENTED test_first_child.py:FirstChild.test_first_child
>>>      INSTRUMENTED test_first_child.py:BaseClass.test_basic
>>>
>>>
>>> Expected Results
>>> ================
>>>
>>> The expected result is to provide users more flexibility when creating
>>> the Avocado tests, being ablr to create a chain of test classes and
>>> providing only the module containing the last one as a test reference.
>>>
>>> Additional Information
>>> ======================
>>>
>>> Avocado uses only static analysis to examine the files and this
>>> feature should stick to this principle in its implementation.
>>>
>>
> 
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 502 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/avocado-devel/attachments/20170607/a6406524/attachment.sig>


More information about the Avocado-devel mailing list