[Avocado-devel] subclassing avocado

Lukáš Doktor ldoktor at redhat.com
Tue Nov 6 07:39:14 UTC 2018


Dne 05. 11. 18 v 22:59 Brian J. Murrell napsal(a):
> Can I subclass avocado as described at
> 
> https://avocado-framework.readthedocs.io/en/latest/SubclassingAvocado.html
> 
> with 52.1?
> 
> I tried duplicating[1] the structure described there exactly and
> running the test_example.py passes but I don't see any of the
> self.log.info() messages in the job.log.
> 
> Cheers,
> b.
> 
> [1] With the exception of putting "sys.path.append('./')" before the
> "from apricot import ApricotTest" because I don't really want to
> install my subclass into my per-user python library using setup.py.
> 

Dear Brian,

it looks like you had to make more changes to get this working without deploying your classes, anyway it should work (and we use it heavily). The simplest way to give this a try would be:

test.py:

```
from avocado import Test                                                                                               
                                                                                                                       
class ApricotTest(Test):                                                                                               
    def setUp(self):                                                                                                   
        self.log.info("Apricot setUp")                                                                                 
                                                                                                                       
    def some_useful_method(self):                                                                                      
        return True                                                                                                    
                                                                                                                       
class MyTest(ApricotTest):                                                                                             
    """                                                                                                                
    :avocado: recursive                                                                                                
    """                                                                                                                
    def test(self):                                                                                                    
        self.assertTrue(self.some_useful_method())                                                                     
```

Slightly advanced version still without deploying your subclass:

apricot/test.py:

```
from avocado import Test                                                                                               
                                                                                                                       
class ApricotTest(Test):                                                                                               
    def setUp(self):                                                                                                   
        self.log.info("Apricot setUp")                                                                                 
                                                                                                                       
    def some_useful_method(self):                                                                                      
        return True   
```

apricot/__init__.py:

```
__all__ = ['ApricotTest']

from .test import ApricotTest
```

test_example.py

```
__all__ = ['ApricotTest']

from .test import ApricotTest
[medic at localhost apricot ]$ cat test_example.py
import sys
sys.path.append('./')

from apricot import ApricotTest

class MyTest(ApricotTest):
    """
    :avocado: recursive
    """
    def test(self):
        self.assertTrue(self.some_useful_method())
```

both work well and "avocado run test_example.py" shows:

```
2018-11-06 08:30:56,165 test             L0240 INFO | START 1-test_example.py:MyTest.test
2018-11-06 08:30:56,202 test             L0005 INFO | Apricot setUp
2018-11-06 08:30:56,213 test             L0750 INFO | PASS 1-test_example.py:MyTest.test
```

in the output using "Avocado 52.1".


I can imagine one possible issue, do you override "__init__" of your "Test" class? If so make sure to call the "super(ApricotTest, self).__init__(...)" to initialize the loggers and everything. Anyway I'd strongly suggest deploying your library instead of "sys.path" trickery. You can use `--user` to only deploy this for your user. Cleaning after such deployment is simple even when you lost track of the names by looking at `rm ~/.local/lib/python$version/site-packages/`.

If this did not help, please send more detailed information (similarly to what I did), ideally with results attached (or at least the output of `avocado --show all -- test_apricot.py`).

Kind regards,
Lukáš

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


More information about the Avocado-devel mailing list