[libvirt] [test-API] RFC: Stabilization of libvirt-test-API

Guannan Ren gren at redhat.com
Fri Mar 30 10:38:23 UTC 2012


On 03/30/2012 05:33 PM, Martin Kletzander wrote:
>
> To answer two of your questions at once, I'll show you an example of
> what I had in mind (BTW: one of the current disadvantages is also the
> fact that each indentation level _must_ be 4 spaces, otherwise you'll
> get an error). Please be aware that this doesn't make almost any sense,
> it just shows a couple of things I think could help everyone a lot.
>
> file testcase.cfg:
>
> # Local variables. You can use these variables only in this testcase
> # file. This requires 1 more line of code in CofigParser.
> [LocalVariables]
> my_hyper = "qemu"
> module = connections
>
> [GlobalVariables]
> # Could be named "Defaults" as these variables will be passed to all
> # test in this testcase file...
> uri = %(my_hyper)s:///system
>
> # This section is not needed if the tests are named Test1.Connect and
> # so on, but it is more readable a understandable for some readers
> [Tests]
> Test_1 = Connect
> Test_2 = Disconnect
>
> [Test.Connect]
> Module = $(connections)s
> Testcase = connect
> # if not specified, this could default to Test.<name>.Params
> Params = SomethingElse
>
> [SomethingElse]
> # ...unless they are overwritten with some others
> uri = %(my_hyper)s:///session
>
> [Test.Connect]
> Module = $(connections)s
> Testcase = disconnect
> # No parameters here (none needed)
>
> And then you will have two tests that look something like this (very
> rough idea with lots of things I had in my mind, just to show how nice
> it could look):
>
> file tests/connections/connect.py:
>
> def get_params(params):
>      # clean the parameters, put defaults for undefined ones, etc.
>      return params
>
> # this means that if needed, this test will create/update these
> # variables in the "shares" (will get to that in a few lines)
> provides = ('connection', 'uri')
>
> def run(logger, test_params, shares):
>      # no need to test the return code, we can raise an exception that
>      # will be caught outside of the test and reported through logger
>      params_cleaned = get_params(test_params)
>
>      # "shares" would be object that takes care of the values shared
>      # between tests, check for dependencies, etc.
>      shares.update('uri', conn)
>
>      logger.debug('using uri: %s' % params_cleaned['uri'])
>
>      # again, no need to check for an exception
>      conn = libvirt.open(params_cleaned['uri'])
>
>      # and for example it could return the values that should be
>      # provided in "shares"
>      return { 'connection' : conn }
>
> file tests/connections/disconnect.py:
>
> def get_params(params):
>      # clean the parameters, put defaults for undefined ones, etc.
>      return params
>
> # this can be either here or evaluated when the test is trying to get
> # the value from the "shares" object
> requires = ('connection',)
>
> def run(logger, test_params, shares):
>      params_cleaned = get_params(test_params)
>      conn = shares.get('connection')
>      logger.info('disconnecting from uri: %s' % conn.getURI())
>      conn.close()
>
> And this would be the two tests with test case that tries to connect and
> disconnect. All the errors are caught in the test runner, if some tests
> depend on exception that is raised in underlying libvirt, they can catch
> it themselves without propagating it up (the whole point of exceptions),
> etc.
>

         The .ini fomat is often used as data storage, that is perfect 
for config file.
         The testcase config currently used by test-API is the default
         testcase writing format in upstream autotest that supported by 
qemu.

         Guannan Ren




More information about the libvir-list mailing list