pyats.aetest package

Module:

aetest

Description:

This module defines the base classes required to write testscripts. It’s name is a direct carry over from Tcl-ATS’s AEtest package.

In short, this module is designed to offer a similar look-and-feel of its Tcl counterpart, whilst leveraging and building based on the advanced object-oriented capabilities of the Python Language.

aetest can be broken down as follows:

  • Common Sections

  • Testcases

For more detailed explanation and usages, refer to aetest documentation on pyATS home page: http://wwwin-pyats.cisco.com/

Subpackages

Submodules

class pyats.aetest.base.Source(obj, objcls=None)

Bases: object

Source Class

This class is enables TestItems and TestContainer sorting (run) order mechanism. It does so by looking at each class’s source information (file & line number) and inheritance relationships.

This is needed to ensure the repeatability of test-script runs.

Rules:

  • CommonSetup & setup section always runs first

  • CommonCleanup & cleanup section always runs last

  • note that Common sections are never sorted versus testcase sections, so the sorting doesn’t differentiate.

  • if one class inherits another, the parent class is smaller than the inherited class

  • otherwise, classes are sorted by their order of appearance (line number) within the script module.

Example

>>> from MyTestScript import TestcaseA, TestcaseB
>>> items = [TestcaseA, TestcaseB]
>>> items.sort(key = Source)

built in __init__

stores the object-to-be-sorted internally and gathering some of its source information (used during sorting).

Parameters:
  • (TestItem) (obj) –

  • (type) (objcls) –

class pyats.aetest.base.TestItem(uid, description=None, parent=None, parameters={}, **kwargs)

Bases: TestResultContext

Test Item class

Base class for all other test classes. TestItem objects contains the bare minimum information for definining a testable. When a TestItem is created, the user needs to pass in a uid and a description for the test item, as well as testable content via kwargs.

Notes

  • TestItems may contain other TestItems

  • TestItem has a parent (or None, in the case of top-level parent)

  • TestItem class is usually not used directly by the user, but rather inherited by its subclasses.

Parameters:
  • (str) (description) –

  • (str)

  • (obj) (parent) –

  • (dict) (parameters) –

  • (kwargs) (kwargs) – test item

static aborted(reason=None, *, data=None, goto=None, from_exception=None)

Test Aborted

API to call when the current test item execution is aborted. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

classmethod apply_data(data)

API that allows the updating of TestItem class’s attributes using a dictionary input. This is exclusively used with datafile feature.

Note - this api avoids re-writing properties and updates the internal __dunder__ attributes instead.

Parameters:

(dict) (data) –

apply_parameters(func, parameters, pargs=())

apply parameters

Applies parameters (funcargs) specified in the TestItem and return a partial function ready for the executor/caller to execute. Supports the current argument types:

  • keyword arguments

  • keyword only arguments

  • variable keyword arguments

  • argument defaults

  • keyword only argument defaults

Does NOT support variable positional arguments.

Internal parameters are prioritized above user parameters.

Parameters:

(ParameterDict) (parameters) – to test func

Return type:

partial function with all the funcargs filled

static blocked(reason=None, *, data=None, goto=None, from_exception=None)

Test Blocked

API to call when the current test item execution is blocked. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

property description

description

returns the test item description, shortcutting this description to be also the __doc__ attribute.

Type:

Property

static errored(reason=None, *, data=None, goto=None, from_exception=None)

Test Errored

API to call when the current test item execution errored out. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

static failed(reason=None, *, data=None, goto=None, from_exception=None)

Test Failed

API to call when the current test item execution is failed. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

property parameters

parameters

returns the dictionary of parameter name/values for this test item. a parameter is a name/value mapping that drives the test item to test and/or behave different.

Example

>>> t = TestItem(uid = 'test', description = '', parameters = {})
>>> t.parameters
{}
Type:

Property

static passed(reason=None, *, data=None, goto=None, from_exception=None)

Test Passed

API to call when the current test item execution is passed. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

static passx(reason=None, *, data=None, goto=None, from_exception=None)

Test Passx

API to call when the current test item execution result is passed with exception. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

static skipped(reason=None, *, data=None, goto=None, from_exception=None)

Test Skipped

API to call when the current test item execution should be skipped. Terminates current execution.

Parameters:
  • (str) (reason) –

  • (any) (data) –

  • (obj) (goto) –

  • (exception) (from_exception) –

class pyats.aetest.base.TestableMeta(name, bases, attrs)

Bases: type

Testable Metaclass

Metaclass that creates the actual Testcase/Testscript classes. Used to hijack the TestContainer subclass creations in order to customize internal behaviors.

Example

>>> class Testcase(TestContainer, metaclass = TestableMeta):
...     pass
>>> class UserTestcase(Testcase):
...     uid = 'userid'
>>> assert UserTestcase.__uid__ == UserTestcase.uid
>>> assert type(UserTestcase) is property

Metaclass __init__

Metaclass api called after class is created. Used here to modify each class attribute/function and add source information.

Parameters:
  • (str) (name) –

  • (list) (bases) –

  • (dict) (attrs) –

class pyats.aetest.commons.Common(uid=None, *args, **kwargs)

Bases: TestContainer

Common Section

Base class for CommonSetup and CommonCleanup. Used to just consolidate common-code instead of copy/pasting.

Note that all common sections are TestContainers, and are worthless until they contain one or more subsections.

built in __init__

Initializes a TestContainer class by finding out the class id definition & passing it upstream to parent TestItem.__init__.

Parameters:
  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

source = <pyats.aetest.base.Source object>
class pyats.aetest.commons.CommonCleanup(uid=None, *args, **kwargs)

Bases: Common

CommonCleanup class

CommonCleanup section removes (cleans) all configurations applied in the whole script, including those from CommonSetup, and all those lingering from the testcases. This section is unique within each test script, and is always run last.

Note

CommonCleanup section is optional within each script.

Example

>>> class ExampleCommonCleanup(aetest.CommonCleanup):
...     @subsection
...     def disconnect_all_devices(self):
...         pass

built in __init__

Initializes a TestContainer class by finding out the class id definition & passing it upstream to parent TestItem.__init__.

Parameters:
  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

source = <pyats.aetest.base.Source object>
class pyats.aetest.commons.CommonSetup(uid=None, *args, **kwargs)

Bases: Common

CommonSetup class

CommonSetup section contains the common configurations/inits required to run subsequent testcases within each test script. Each test script may only have a single CommonSetup class defined, and this CommonSetup class is then broken down into smaller subsection (methods with decorators). CommonSetup section runs first in all test scripts.

Note

CommonSetup section is optional within each script.

Example

>>> class ExampleCommonSetup(aetest.CommonSetup):
...     @subsection
...     def connect_devices(self):
...         pass

built in __init__

Initializes a TestContainer class by finding out the class id definition & passing it upstream to parent TestItem.__init__.

Parameters:
  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

source = <pyats.aetest.base.Source object>
class pyats.aetest.discovery.BaseDiscovery(target)

Bases: object

Base Class for all discovery classes

discover()
order()
class pyats.aetest.discovery.BaseTestDiscovery(target)

Bases: BaseDiscovery

Base Class for test section discovery

class pyats.aetest.discovery.CommonDiscovery(target)

Bases: BaseTestDiscovery

Discovery Class for Common Sections, find subsections

discover()

Common section discovery

The discovery process for all common sections is the same: look for subsections. A subsection is basically a class method decorated with @subsection decorator.

Also checks whether this common container contains the correct objects. Eg, if test sections are found, then errors are raised.

Return type:

List of subsections TestFunctions.

order(*subsections)
class pyats.aetest.discovery.ScriptDiscovery(target)

Bases: BaseDiscovery

Default discovery class for aetest test scripts, finds and orders the Testcases

discover()

discovery of test script sections

This api looks within the module contained in this TestScript class, and returns a list of those sections (classes), in their order of execution.

Discovery is based on classs, eg, test script may contain CommonSetup, Testcases and CommonCleanups.

Returns:

1 value

Return type:

ordered test script sections

order(setup=None, testcases=[], cleanup=None)

Puts testcases in order

Parameters:
  • setup (-) – common_setup section

  • testcases (-) – list of testcases

  • cleanup (-) – common_cleanup section

Returns:

Creates order for all 3 parameters provided above and returns a single list

class pyats.aetest.discovery.TestcaseDiscovery(target)

Bases: BaseTestDiscovery

Default discovery class for aetest test cases, finds and orders the tests

discover()

Testcase discovery

Main api to be called when it is turn to discover what’s defined within a testcase. Basically discovers any methods decorated with @setup, @test and @cleanup (or, has __testcls__ attribute tagged).

Return type:

List of test sections (TestFunctions)

order(setup=None, tests=[], cleanup=None)

Puts test sections in order

Parameters:
  • setup (-) – common_setup section

  • tests (-) – list of testcases

  • cleanup (-) – common_cleanup section

Returns:

Creates order for all 3 parameters provided above and returns a single list

exception pyats.aetest.exceptions.AEtestExceptions

Bases: Exception

base class

exception pyats.aetest.exceptions.DatafileError

Bases: AEtestExceptions

Raised when there’s an issue loading the datafile

exception pyats.aetest.exceptions.InvalidContextError

Bases: AEtestExceptions

Errors for contexts in the wrong place e.g. Testcase in Common sections

exception pyats.aetest.exceptions.MultiSectionError

Bases: AEtestExceptions

Errors the max number of allowed sections is exceeded e.g. only 1 setup

exception pyats.aetest.exceptions.SequenceError

Bases: AEtestExceptions

Error when something in the sequence is not defined in the test container

exception pyats.aetest.exceptions.StepDebugFileLoadError

Bases: AEtestExceptions

Raised when an error occurs while loading Yaml config file

class pyats.aetest.loop.DefaultLooper(uids=None, *, loopee=None, args=None, argvs=None, filler=None, **kwargs)

Bases: object

Default Loop Generation Class

The default loop generation iterator that generates testable Iterations.

  • provide new uids for each iteration

  • default uids to number generator

  • provide fixed argument/values input

  • provides kwargs argument/values input

  • auto-fills missing loop argument positions

  • last-minute generation of iteration (yield)

Behaviors:

  • missing argument positions will be filled with filler, regardless of if it’s kwargs mismatching or argvs mismatching

  • if user provided UIDs, then it doesn’t matter how many argument values are provided, the iterations end when we run out of uids

  • if using default uid generation, the loop ends when we exhaust all arguments

Example

>>> iterations = DefaultLooper(a = [1, 2, 3]
>>> iterations = DefaultLooper(args = ['a'], argvs = ((1,), (2,), (3,)))

DefaultLooper __init__

Instanciates the loop iterable. In typical user scripts, this API is instantiated when the module (script) is loaded.

Parameters:
  • (iterable/callable) (argvs) – sequence of unique iteration UIDs. Defaults to a counter starting from 1 and auto-increment by 1 per iteration.

  • (obj) (filler) – uid default prefix when uids str not provided. if not provided, defaults to prefix “iteration”

  • (iterable/callable) – sequence) of arguments for each iteration

  • (iterable/callable) – sequence) of argument values for each iteration, each matching in position to args above.

  • (obj) – argument value positions. Default to None

  • (kwargs) (kwargs) – that is added to the list of argvs

Examples

# iteration with 2 arguments and 3 sets of iterations >>> DefaultLooper(args = (‘a’, ‘b’), argvs = ((1,2), (2,3)))

# iteration with 1 kwarg and 2 iterations >>> DefaultLooper(a = [1,2])

# iteration with custom uids iterating 3 times >>> DefaultLooper(uids = [‘a’, ‘b’, ‘c’])

static uid_generator(prefix, parameters)

Loop uid generator

Default loop uid generator, used when a loop iteration uid was not given implicitly. The generated uid format is:

<loopee name>[arg_a=value_a,arg_b=value_b,…]

where the loopee name is the function/class name.

Parameters:
  • (string) (prefix) –

  • (dict) (parameters) –

Examples

Tc_one[a=3]

test[b=7] test[b=8] test[b=9]

class pyats.aetest.loop.Iteration(uid, parameters)

Bases: tuple

Create new instance of Iteration(uid, parameters)

parameters

Alias for field number 1

uid

Alias for field number 0

class pyats.aetest.loop.LoopDecorator(*args, generator=<class 'pyats.aetest.loop.DefaultLooper'>, **kwargs)

Bases: object

AEtest testable loop decorator

Defines & uses the AEtest loopable protocol that enables testable (section, Testcase etc) looping. This API is the decorator called within the user script that marks the testable to be looped during execution.

Note that this class is not used directly. Rather, users should be calling the @loop decorator instead (set below)

Loop Protocol:

  • testables with attr __loop__ (and is an iterable) is loopable

  • __loop__ obj should return Iteration objects when iterated, and contains:

    • uid: the uid of the loop iteration

    • kwargs: dict of key-value mapping that are called as funcargs for

      the looping testable

Example

>>> @aetest.loop(uids = [1, 2])
... class Testcase(aetest.Testcase):
...     pass
>>> @aetest.loop(loop_value = ['a', 'b', 'c'])
... class Testcase(aetest.Testcase):
...     pass

loop __init__

Parameters:
  • (obj) (generator) –

  • (obj)DefaultLooper. using this argument enables users to supply a custom Iteration generator

  • (kwargs) (kwargs) –

classmethod mark(obj, *args, **kwargs)

mark for loops

classmethod of LoopDecorator. Used within testscript sections to enable post-mortem looping, eg. to mark a testcase or a section that occurs after this current section for looping. This is different from typical @loop decorator looking, in the sense that it allows users to configure testcase/section looping dynamically.

Example

>>> class CommonSetup(aetest.CommonSetup):
...     @aetest.subsection
...     def subsection(self):
...         aetest.loop.mark(Testcase, uids = [1,2,3])
...
>>> class Testcase(aetest.Testcase):
...     pass
Parameters:
  • (object) (obj) –

  • args) (args (list) –

  • (kwargs) (kwargs) –

Return type:

None

pyats.aetest.loop.get_iterations(obj)

returns an iterator/generator of test iterations currently defined for the given object.

Parameters:

(obj) (obj) –

Return type:

iterator/generator of iterations

pyats.aetest.loop.loop

alias of LoopDecorator

pyats.aetest.loop.loopable(obj)

determines whether a test object is loopable based on the aetest looping protocol.

Parameters:

(obj) (obj) –

Return type:

True if object is loopable, False otherwise.

class pyats.aetest.main.AEtest(commandline=False, parser=None, legacy_cli=True)

Bases: object

Built-in __init__

Initializes AEtest object with default values required for the parser.

Parameters:
  • (bool) (legacy_cli) –

  • (argparse.ArgumentParser) (parser) –

  • (bool)

configure_logging()

configure logging Configure logging level based on the values from CLI args parsing and values passed to the method.

configure_parser(commandline, parser, legacy)

configure cli parser

configure and returns a parser that can parse sys.argv. This api takes care of two things:

  1. parse sys.args passed from upstream (easypy), where any arguments not parsed by easypy or the job file is passed-through to aetest and the script, and

  2. parse sys.argv when executing in command-line mode (outside of easypy environment)

Parameters:
  • (argparse.ArgumentParser) (parser) –

  • (bool) (legacy) –

parse_args(argv=None)

Parse sys.argv Parse the arguments present in sys.argv After parsing the known arguments remove them from sys.argv and keep the rest. Pay attention to always keep the testable program

Return type:

dictionary of argument name/value where value is not None

run(testable, uid=None, reporter=None, uids=None, groups=None, pdb=False, step_debug=None, loglevel=0, random=False, random_seed=None, max_failures=None, pause_on=None, datafile=None, processors=None, **script_args)

run test engine

main API that runs a given testable. A testable can be a python AEtest script file, a script module (pre-loaded), or a pre-loaded module name.

Parameters:
  • (obj) (testable) – or a module name.

  • (TestableId) (uid) –

  • (BaseRootReporter) (reporter) – the BaseRootReporter class.

  • (callable) (groups) – if that section is to be run

  • (callable) – test if that section is to be run

  • (bool) (random) –

  • (dict) (processors) –

  • (level) (loglevel) –

  • (bool) – in random order.

  • (int) (max_failures) – testcases. Use this to repeat a previously randomized run.

  • (int) – aborting script run

  • (script_args) (script_args) – be passed to script level as script args.

  • (string) (datafile) – format that holds phrases, testcases, stopper type and timeout values

  • (string) – script/testcase section data & features

  • (dict)

pyats.aetest.main.main(testable='__main__', **kwargs)

Shortcut call to run AEtest Main Program

This is needed in order to stay compatible for test scripts to run as a standalone script without using the __main__ functionality.

It simply wraps AEtest class to run with module name ‘__main__’, and exit.

Parameters:

(dict) (kwargs) – to AEtest.runTests function.

Example

>>> if __name__ == '__main__':
...     aetest.main()
class pyats.aetest.parameters.Parameter(function, **kwargs)

Bases: object

Parameter class

internal object, used to stored the parametrized callable objects (such as functions and classes) defined in the user test script module. This class stores the original call argument for each parameter, and as well allows future extensions to support parameter auto-scoping, etc.

built-in __init__

stores a proxy of the callable object (for later evaluations)

Parameters:
  • (callable) (func) – as a test input parameter

  • (dict) (kwargs) – callable

class pyats.aetest.parameters.ParameterDict(*args, **kwargs)

Bases: UserDict

Parameters Dictionary

Subclass of python UserDict, similar to dict(), enabling the infra to carry an internal dictionary that stores the current internal/special parameters such as a reference to the testscript/testcase/section object in the current scope.

built-in __init__

initializes the class. Also adds self.internal to the obj so that internal parameters can be tracked.

copy()

built-in copy

same as the dict.copy() api, except also creates a copy of internal.

update(*args, **kwargs)

built-in update

same as the dict.update() api. additionally also updates the internal dictionary with the given object, if it is also a ParameterDict

class pyats.aetest.parameters.ParameterMap(*maps)

Bases: ChainMap

Parameters Map

Subclass of python3 collections.ChainMap, enabling the infrastructure to chain together parent/child ParameterDict into a ChainMap style relationship.

built-in __init__

initializes the ParmaeterMap class. Also adds self.internal to the obj so that internal parameters can be tracked.

Note that we do not typecast maps argument: always use this with ParameterDict argument.

property local

the first parameter map item is always the local parameter

new_child(m=None)

built-in new_child

same as the ChainMap.new_child() api, except also creates a new child of internal.

update(*args, **kwargs)

built-in update

same as the dict.update() api. additionally also updates the internal dictionary with the given object, if it is also a ParameterMap

pyats.aetest.parameters.discover_parameters(obj)

discover parameters

checks all attributes of a given object and return a dictionary of parameter list/parameter object based on whether its attributes were parametrized. This api is mostly intended to be called on the script module object to discover script-level parameters.

Parameters:

(object) (obj) –

Return type:

dict() of name/parameter object

pyats.aetest.parameters.parametrize(target=None, **kwargs)

Parametrize decorator

Decorator used within test script to mark a function/class to be useable as as parameter within test script section. A marked function will have its Parameter class stored under __parameter__ attribute, but otherwise unchanged.

Parameters:
  • (obj) (target) –

  • (kwargs) (kwargs) – the parameter object

Return type:

target function, marked with __parameter__

Examples

>>> @parametrize
>>> def simpleParam():
...     pass
>>> @parametrize(a=1, b=2)
>>> def argParam(a, b):
...     return a+b
pyats.aetest.parameters.parametrized(obj)

parametrization check

API to return whether a given object has been parametrized (eg, has the __parameter__ attribute).

Parameters:

(object) (obj) –

Return type:

True/False

class pyats.aetest.script.TestScript(module, uid=None, reporter=None)

Bases: TestItem

TestScript class

Class that wraps a test script module. A test script in python is just a python module (type.ModuleType). This is not an extension of the module type. Rather, it’s a class wraps the module and provides additional functionality (such as test parametrization).

Note

technically a TestScript class should inherit from TestContainer since it really is a container. However, there are practical differences between the two, such as a TestContainer being indirectly inherited by the user, and TestScript being totally transparent to the user, etc. Thus, this class inherit from the base TestItem instead.

built-in __init__

instantiates the TestScript class with a module (the test script module) and looks into the module to see if there are any parameters to be discovered.

Parameters:
  • (type.ModuleType) (module) –

  • (BaseRootReporter) (reporter) – reporter for TestScript

apply_data(data)

Applies the content of a dictionary (data) recursively into the currently loaded module. The data needs to follow a specific structure (as outlined by datafile/schema).

This API patches all live classes (Common*/Testcase classes etc), and leverages TestItem.apply_data() api to work.

Parameters:

(dict) (data) –

classmethod from_source(testable, uid=None, reporter=None)

classmethod from_source

API to load user supplied testable to a TestScript class allowing the testable TestScript to be run directly.

Parameters:
  • (obj) (testable) – of a loaded module, or an absolute module path

  • (str) (uid) –

  • (BaseRootReporter) (reporter) – reporter for TestScript

Return type:

TestScript() class instantiated.

load_datafile(datafile)

Loads the content of input datafile into dictionary, and apply to to the module & its objects.

Note: this could have been implemented using recursive object attribute updates. However, that approach would yield very non-user-friendly exceptions, hence putting it down straight as loop-in-loop.

>>> for k, v in content.items():
...     if k == 'parameters':
...     # parameters must be updated instead of overwritte
...     # __parameters__ is the internal attribute
...     obj.__parameters__.update(content['parameters'])
...
...     elif isinstance(v, Mapping):
...         recur_testitem_update(getattr(obj, k), v)
...     else:
...         setattr(obj, k, v)
...
... return obj
Parameters:

(str) (datafile) –

randomize(flag, seed=None)

enable/disable randomization of testcase run sequence. This internally instantiates a random.Random generator using the provided seed. If no seed was provided, a random seed between 0 and sys.maxsize is generated as the seed.

Parameters:
  • (bool) (flag) –

  • (int) (seed) –

class pyats.aetest.sections.CleanupSection(function, uid=None, *args, **kwargs)

Bases: TestcaseSection

CleanupSection class

Testcase cleanup section. Wrapper class for @cleanup marked Testcase function/method. Normally not seen/used directly by the user.

built-in __init__

Initializes the TestFunction by storing the given function (obj method)

Parameters:
  • (function) (function) –

  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

class pyats.aetest.sections.SetupSection(function, uid=None, *args, **kwargs)

Bases: TestcaseSection

SetupSection class

Testcase setup section. Wrapper class for @setup marked Testcase function/method. Normally not seen/used directly by the user.

built-in __init__

Initializes the TestFunction by storing the given function (obj method)

Parameters:
  • (function) (function) –

  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

class pyats.aetest.sections.Subsection(function, uid=None, *args, **kwargs)

Bases: TestFunction

Subsection class

Extends TestFunction class to support the @subsections decorator. This class wraps each subsection (Common section method/functions) into a class object, enabling the infrastructure to track results, parameters & etc.

Note

this class is normally not used/seen by the user script.

built-in __init__

Initializes the TestFunction by storing the given function (obj method)

Parameters:
  • (function) (function) –

  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

class pyats.aetest.sections.TestSection(function, uid=None, *args, **kwargs)

Bases: TestcaseSection

TestSection class

Testcase test sections. Wrapper class for @test marked Testcase function/methods. Normally not seen directly by the user. This class serves no purpose other than to make TestSections a unique class.

built-in __init__

Initializes the TestFunction by storing the given function (obj method)

Parameters:
  • (function) (function) –

  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

class pyats.aetest.sections.TestcaseSection(function, uid=None, *args, **kwargs)

Bases: TestFunction

TestcaseSection class

Base class that represents each Testcase section (such setup/test/cleanup). Only used to aggregate common functionality/code.

Note

this class is normally not used/seen by the user script.

built-in __init__

Initializes the TestFunction by storing the given function (obj method)

Parameters:
  • (function) (function) –

  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

pyats.aetest.sections.cleanup(function=None, class_=<class 'pyats.aetest.sections.CleanupSection'>)

cleanup decorator

Decorator used to mark a Testcase section class method as its cleanup. Each Testcase may only have a single cleanup section, which removes all the env changes (configurations) left behind by the testcase.

Note that cleanup section cannot be looped

Parameters:
  • (function) (function) –

  • (class) (class) – allows users to supply a subclass of the default class, changing the default behavior. Default: SetupSection

Return type:

original function, marked.

Example

>>> class Testcase(aetest.Testcase):
...     @aetest.cleanup
...     def simple_cleanup(self):
...         pass
pyats.aetest.sections.setup(function=None, class_=<class 'pyats.aetest.sections.SetupSection'>)

setup decorator

Decorator used to mark a Testcase section class method as its setup. Each Testcase may only have a single setup section, which performs all the necessary configurations/checks required to run this Testcase. If a setup section is failed for a Testcase, the Testcase will not run. Note that setup section cannot be looped

Parameters:
  • (function) (function) –

  • (class) (class) – allows users to supply a subclass of the default class, changing the default behavior. Default: SetupSection

Return type:

original function, marked.

Example

>>> class Testcase(aetest.Testcase):
...     @aetest.setup
...     def simple_setup(self):
...         pass
pyats.aetest.sections.subsection(function=None, class_=<class 'pyats.aetest.sections.Subsection'>)

subsection decorator

Decorator used to mark a Common section class method as a subsection. Each subsection is a smaller breakdown/action step of its parent common section, where the final result of the common section is a combined roll up of all of its subsections.

Parameters:
  • (function) (function) –

  • (class) (class) – allows users to supply a subclass of the default class, changing the default behavior. Default: Subsection

Return type:

original function, marked.

Example

>>> class ExampleCommonSetup(aetest.CommonSetup):
...     @aetest.subsection
...     def simple_subsection(self):
...         pass
pyats.aetest.sections.subsection_loop(function=None, class_=<class 'pyats.aetest.sections.Subsection'>, **kwargs)

subsection loop decorator

Decorator used to mark a Common section class method as a subsection, and also loop that subsection using the given arguments. This is the exact same as subsection decorator, with the addtional support of also marking this subsection for looping in one shot. This is intended to make the user’s life easier and make the script look cleaner.

Parameters:
  • (function) (function) –

  • (class) (class) – allows users to supply a subclass of the default class, changing the default behavior. Default: Subsection

  • (kwargs) (kwargs) –

Return type:

original function, marked.

Example

>>> class ExampleCommonSetup(aetest.CommonSetup):
...     @aetest.subsection.loop(ids = ('id_one', 'id_two'))
...     def looped_subsection(self):
...         pass
pyats.aetest.sections.test(function=None, class_=<class 'pyats.aetest.sections.TestSection'>)

test decorator

Decorator used to mark a Testcase’s test section. Each testcase may have one or more test sections. A test section performs, ideally, a single test of a single type, so that the combined result of a Testcase is the aggregate result of all its tests.

Parameters:
  • (function) (function) –

  • (class) (class) – allows users to supply a subclass of the default class, changing the default behavior. Default: Subsection

Return type:

original function, marked.

Example

>>> class Testcase(aetest.Testcase):
...     @aetest.test
...     def simple_test(self):
...         pass
pyats.aetest.sections.test_loop(function=None, class_=<class 'pyats.aetest.sections.TestSection'>, **kwargs)

test loop decorator

Decorator used to mark a Testcase’s test section, and also loop that test section using the given arguments. This is the exact same as the test decorator, with the addtional support of also marking this test for looping in one shot. This is intended to make the user’s life easier and make the script look cleaner.

Parameters:
  • (function) (function) –

  • (class) (class) – allows users to supply a subclass of the default class, changing the default behavior. Default: Subsection

  • (kwargs) (kwargs) –

Return type:

original function, marked.

Example

>>> class Testcase(aetest.Testcase):
...     @aetest.test.loop(ids = ('id_one', 'id_two'))
...     def looped_test(self):
...         pass
exception pyats.aetest.signals.AEtestAbortedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Aborted
exception pyats.aetest.signals.AEtestBlockedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Blocked
exception pyats.aetest.signals.AEtestErroredSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Errored
exception pyats.aetest.signals.AEtestFailedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Failed
exception pyats.aetest.signals.AEtestInternalSignals

Bases: BaseException

Internal Signals class

The intention of this class is to subclass from BaseException and create a new exception to be used internally for signaling purposes. These are not exceptions in the sense that something “errored”, but more used for the fact that raising exceptions causes the code to terminate and return, so that we can collect immediate results.

Note that this is subclassing BaseException for the purpose of not being caught when try…except Exception is written in the script.

exception pyats.aetest.signals.AEtestPassedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Passed
exception pyats.aetest.signals.AEtestPassxSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Passx
exception pyats.aetest.signals.AEtestSkippedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

result = Skipped
exception pyats.aetest.signals.AEtestStepAbortedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Aborted
exception pyats.aetest.signals.AEtestStepBlockedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Blocked
exception pyats.aetest.signals.AEtestStepErroredSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Errored
exception pyats.aetest.signals.AEtestStepFailedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Failed
exception pyats.aetest.signals.AEtestStepPassedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Passed
exception pyats.aetest.signals.AEtestStepPassxSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Passx
exception pyats.aetest.signals.AEtestStepSkippedSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: StepSignal

result = Skipped
exception pyats.aetest.signals.ResultSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: AEtestInternalSignals

Subclassing AEtestInternalSignals, intended only to be used for signaling immediate results to the executer.

post_mortem()

post mortem debug the result signal

uses pdb.post_mortem to debug the location where the current signal is raised. Does nothing if the current signal result is not Errored or Failed.

Note

this is a customized code from pdb.post_mortem() and Pdb.interact(), basically skipping the current result signal frame and going back into the user script frame.

property result
exception pyats.aetest.signals.StepSignal(reason=None, goto=None, from_exception=None, data=None)

Bases: ResultSignal

exception pyats.aetest.signals.TerminateStepSignal

Bases: AEtestInternalSignals

Used to signal step termination to executer engine. Do not use for other purposes.

class pyats.aetest.testcase.Testcase(*args, **kwargs)

Bases: TestContainer

Testcase class

Testcases are the main container/collection of smaller tests. Each script must contain one or more testcases which carries out the heavy-lifting w.r.t actually performing the testing. Each testcase is further broken down into a single setup section, a cleanup section, and multiple tests. This class is intended to be subclassed (inherited) within the user test script for each individual testcase.

Example

>>> class MyTestcase(aetest.Testcase):
...     @aetest.setup
...     def setup(self):
...         pass
...
...     @aetest.test
...     def test(self):
...         pass
...
...     @aetest.cleanup
...     def cleanup(self):
...         pass

built in __init__

Initializes a TestContainer class by finding out the class id definition & passing it upstream to parent TestItem.__init__.

Parameters:
  • (str) (uid) –

  • args/kwargs (arguments passed to parent TestItem.__init__) –

source = <pyats.aetest.base.Source object>