[Avocado-devel] [RFC] Avocado Test Loader: Test types and extended status

Cleber Rosa crosa at redhat.com
Tue Jul 23 15:14:52 UTC 2019


=====================================================
 Avocado Test Loader: Test types and extended status
=====================================================

The current architecture of the Avocado Test Loader has a number of
shortcomings.

First, although not directly related to the major topic being present
here, it's worth noticing that the various test loader implementations
are still not implemented the same way that other extensible areas of
Avocado are.  Basically, it does *not* describe and interface at
`avocado.core.plugin_interfaces`, which should be followed by the
actual test loader implementations.

This can be explained by the fact that the test loader implementation
preceeds the "new" plugin architecture, and has not yet been ported.
Given that this document will suggest changes to the Avocado Test
Loader subsystem, it makes sense to also consider porting it to the
"new" architeture.  This task can will be tracked here:

https://trello.com/c/H3hSd3Lm/1123-test-loader-adapt-implementation-to-the-new-plugin-architecture

But the most urgent violation in the architecture is one the most
visible to users: "test types" which are not really tests.

Abuse of test types
===================

A sample command execution can quickly show the current breakage
when it comes to test types::

  $ avocado list -V /dev/null
  Type       Test                                                                                NOT_A_TEST /dev/null: Not an INSTRUMENTED (avocado.Test based), PyUNITTEST (unittest.TestCase based) or SIMPLE (executable) test
  !GLIB      /dev/null: No GLib-like tests found
  !GOLANG    /dev/null: Go binary not found.
  !ROBOT     /dev/null: Data source does not exist.

  TEST TYPES SUMMARY
  ==================
  !GLIB: 1
  !GOLANG: 1
  !ROBOT: 1
  ACCESS_DENIED: 0
  BROKEN_SYMLINK: 0
  EXTERNAL: 0
  GLIB: 0
  GOLANG: 0
  INSTRUMENTED: 0
  MISSING: 0
  NOT_A_TEST: 1
  PYUNITTEST: 0
  ROBOT: 0
  SIMPLE: 0

A partial list of the problems that this output reveals:

 1) `NOT_A_TEST` and `!ROBOT` (and many others) listed under "Type"
    are not really test types, but representations of the loader
    "findings" on a given test reference, which I'll call "test
    reference resolution result" from now on.  The same applies to
    `ACCESS_DENIED`, `BROKEN_SYMLINK` and `MISSING`, which are
    listed as test types, but in fact are not.
 2) `NOT_A_TEST` is a "test reference resolution result" that is only
    used for `INSTRUMENTED` and `SIMPLE` tests (although the given
    message only makes it clear for the INSTRUMENTED test type)
 3) The "TEST TYPE SUMMARY" reports a total count of 2 for one given
    reference, not because two tests were found, but because they
    were *not* found by two different loaders (FileLoader and
    RobotLoader).

One may argue that having well defined "test types" such as
`ACCESS_DENIED` are useful so that the user can tell what was wrong
with the loading of the test.  But, the fact is that the same
information can be given without categorizing it as a test type.

Expected behavior
=================

The following command output would be produced if the problems listed
previously did not exist.  Fist, if an only a test reference that can
not be resolved into a valid test type were given, output similar to
the following would be expected::

  $ avocado list /dev/null
  Unable to resolve reference(s): '/dev/null'

  Resolution process results:
  ===========================
  Reference   Plugin            Result    Info
  /dev/null   file
  /dev/null   yaml_testsuite
  /dev/null   robot
  /dev/null   external

The key point here is that *no test* was found when a number of
plugins attempted to find one.  Plugins should be free to add
additional information, such as::

  $ avocado list /does/not/exist
  Unable to resolve reference(s): '/does/not/exist'

  Resolution process results:
  ===========================
  Reference         Plugin            Result    Info
  /does/not/exist   file                        FileNotFoundError: [Errno 2] No such file or directory
  /does/not/exist   yaml_testsuite              Failed to parse YAML file
  /does/not/exist   robot
  /does/not/exist   external

Proposed Solution
=================

Instead of delving into too much theory, a PR has been posted with a
RFC implementation of a new resolver architecture.  To avoid
disruption, that PR introduces a "resolve" command (instead of "list")
and hooks itself into the "nrunner" experimental test runner.

Feedback to this and to the PR "[RFC] Introduce avocado.core.resolver
as an alternative to loader" are extremely welcome.




More information about the Avocado-devel mailing list