[Avocado-devel] subclassing avocado
Lukáš Doktor
ldoktor at redhat.com
Tue Nov 6 15:38:33 UTC 2018
Dne 06. 11. 18 v 14:26 Brian J. Murrell napsal(a):
> On Tue, 2018-11-06 at 08:39 +0100, Lukáš Doktor wrote:
>>
>
> Hi Lukáš.
>
>> 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).
>
> Still can't seem to get it to work.
>
>
>> The simplest way to give this a try would be:
>
> apricot/test.py:
>
> ```
> from avocado import Test
>
> class ApricotTest(Test):
> def setUp(self):
> self.log.info("setUp() executed from Apricot")
>
> def some_useful_method(self):
> return True
>
> class MyTest(ApricotTest):
> """
> :avocado: recursive
> """
> def test(self):
> self.assertTrue(self.some_useful_method())
> ```
>
> apricot/__init__.py:
> ```
> __all__ = ['ApricotTest']
>
> from .test import ApricotTest
> ```
>
> tests/test_example.py:
> ```
> __all__ = ['ApricotTest']
>
> from .test import ApricotTest
> ```
>
> ./test_example.py:
> ```
> import sys
> sys.path.append('./')
>
> from apricot import ApricotTest
>
> class MyTest(ApricotTest):
> """
> :avocado: recursive
> """
> def setUp(self):
> self.log.info("setUp() executed from test_example.py")
Here you have to call setUp of the parent class by:
```
super(MyTest, self).setUp()
```
otherwise python simply returns without looking at parent(s). Note this is not Avocado-specific, it's the way python deals with inheritance.
Hopefully this helps,
Lukáš
>
> def test(self):
> print "test()"
> ```
>
>> both work well
>
> I'm not sure what "both" are. I assume in your example you were giving
> a choice of two ways to do something but I couldn't quite work out
> which were your "or" choices.
>
> So with the above, this is what I get:
>
> $ avocado run test_example.py
> JOB ID : 536b1cb21ebd5f10aaf875d9e112a024962efb31
> JOB LOG : /home/brian/apricot/avocado/job-results/job-2018-11-06T08.16-536b1cb/job.log
> (1/1) test_example.py:MyTest.test: PASS (0.03 s)
> RESULTS : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0 | CANCEL 0
> JOB TIME : 0.55 s
> JOB HTML : /home/brian/apricot/avocado/job-results/job-2018-11-06T08.16-536b1cb/results.html
> $ cat avocado/job-results/latest/job.log
> ...
> 2018-11-06 08:16:05,697 test L0240 INFO | START 1-test_example.py:MyTest.test
> 2018-11-06 08:16:05,831 test_example L0011 INFO | setUp() executed from test_example.py
> 2018-11-06 08:16:05,831 output L0655 DEBUG| test()
> 2018-11-06 08:16:05,832 sysinfo L0366 DEBUG| Not logging /var/log/messages (lack of permissions)
> 2018-11-06 08:16:05,859 test L0750 INFO | PASS 1-test_example.py:MyTest.test
> 2018-11-06 08:16:05,860 test L0733 INFO |
>
> As you can see, I didn't get the "setUp() executed from Apricot"
> executing.
>
>> I can imagine one possible issue, do you override "__init__" of your
>> "Test" class?
>
> No.
>
>> Anyway I'd strongly suggest deploying your library instead of
>> "sys.path" trickery.
>
> I just don't want to dirty up my colleagues personal python libraries.
>
>> 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/`.
>
> Sure. But I don't really want everyone to have to (know to) do that.
> I want my testing "tree" to be self-contained. Not to mention that
> "make install" (which this kind of deploy is) is inherently messy and
> leads to chaos.
>
>> 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`).
>
> That gives me a usage error. I thought it was because I don't have a
> test_apricot.py, so I tried "avocado --show all -- test_example.py" but
> that gives the same error:
>
> $ avocado --show all -- test_example.py
> stevedore.extension: found extension EntryPoint.parse('zip_archive = avocado.plugins.archive:ArchiveCLI')
> stevedore.extension: found extension EntryPoint.parse('tap = avocado.plugins.tap:TAP')
> stevedore.extension: found extension EntryPoint.parse('journal = avocado.plugins.journal:Journal')
> stevedore.extension: found extension EntryPoint.parse('json = avocado.plugins.jsonresult:JSONCLI')
> stevedore.extension: found extension EntryPoint.parse('wrapper = avocado.plugins.wrapper:Wrapper')
> stevedore.extension: found extension EntryPoint.parse('gdb = avocado.plugins.gdb:GDB')
> stevedore.extension: found extension EntryPoint.parse('replay = avocado.plugins.replay:Replay')
> stevedore.extension: found extension EntryPoint.parse('xunit = avocado.plugins.xunit:XUnitCLI')
> stevedore.extension: found extension EntryPoint.parse('envkeep = avocado.plugins.envkeep:EnvKeep')
> stevedore.extension: found extension EntryPoint.parse('html = avocado_result_html:HTML')
> stevedore.extension: found extension EntryPoint.parse('exec-path = avocado.plugins.exec_path:ExecPath')
> stevedore.extension: found extension EntryPoint.parse('run = avocado.plugins.run:Run')
> stevedore.extension: found extension EntryPoint.parse('sysinfo = avocado.plugins.sysinfo:SysInfo')
> stevedore.extension: found extension EntryPoint.parse('list = avocado.plugins.list:List')
> stevedore.extension: found extension EntryPoint.parse('multiplex = avocado.plugins.multiplex:Multiplex')
> stevedore.extension: found extension EntryPoint.parse('plugins = avocado.plugins.plugins:Plugins')
> stevedore.extension: found extension EntryPoint.parse('diff = avocado.plugins.diff:Diff')
> stevedore.extension: found extension EntryPoint.parse('variants = avocado.plugins.variants:Variants')
> stevedore.extension: found extension EntryPoint.parse('config = avocado.plugins.config:Config')
> stevedore.extension: found extension EntryPoint.parse('distro = avocado.plugins.distro:Distro')
> usage: avocado [-h] [-v] [--config [CONFIG_FILE]] [--show [STREAM[:LVL]]] [-s]
> {config,diff,distro,exec-path,list,multiplex,plugins,run,sysinfo,variants}
> ...
>
> Avocado Test Runner
>
> optional arguments:
> -h, --help show this help message and exit
> -v, --version show program's version number and exit
> --config [CONFIG_FILE]
> Use custom configuration from a file
> --show [STREAM[:LVL]]
> List of comma separated builtin logs, or logging
> streams optionally followed by LEVEL (DEBUG,INFO,...).
> Builtin streams are: "test": test output; "debug":
> tracebacks and other debugging info; "app":
> application output; "early": early logging of other
> streams, including test (very verbose); "remote":
> fabric/paramiko debug; "all": all builtin streams;
> "none": disables regular output (leaving only errors
> enabled). By default: 'app'
> -s, --silent disables regular output (leaving only errors enabled)
>
> subcommands:
> valid subcommands
>
> {config,diff,distro,exec-path,list,multiplex,plugins,run,sysinfo,variants}
> subcommand help
> config Shows avocado config keys
> diff Shows the difference between 2 jobs.
> distro Shows detected Linux distribution
> exec-path Returns path to avocado bash libraries and exits.
> list List available tests
> multiplex Tool to analyze and visualize test variants and params
> plugins Displays plugin information
> run Runs one or more tests (native test, test alias,
> binary or script)
> sysinfo Collect system information
> variants Tool to analyze and visualize test variants and params
>
> avocado: error: argument subcommand: invalid choice: '--' (choose from 'config', 'diff', 'distro', 'exec-path', 'list', 'multiplex', 'plugins', 'run', 'sysinfo', 'variants')
>
> Much thanks for you all of your help.
>
> Cheers,
> b.
>
-------------- 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/fc7333dc/attachment.sig>
More information about the Avocado-devel
mailing list