3 created by [Cédric Ollivier](mailto:cedric.ollivier@orange.com)
9 - Functest integrates lots of heteregeounous testcases:
11 - internal vs external
12 - it aims to benefit from object programming
13 - to define common operations
14 - to avoid conditional instructions regarding the testcases
15 - to avoid duplicating code
16 - to ease the integration of third-party testcases (written in Bash or Python)
23 ### Functest function calls
25 - **CI** calls *run_tests.py* (please see [jenkins jobs](https://gerrit.opnfv.org/gerrit/gitweb?p=releng.git;a=tree;f=jjb/functest))
26 - *run_tests.py* parses *functest/ci/testcases.yaml* to:
27 - check which testcase(s) must be run
28 - execute the common operations on every testcase (run, push its results to db...)
29 <!-- .element: class="fragment highlight-red"-->
30 - return the right status code to **CI**
35 - limit run_tests.py instructions by defining:
36 - the basic testcase attritutes
37 - all common operations
38 - the status codes expected
39 - avoid duplicating codes between testcases
40 - ease the developpement of third-party testcases (aka features)
46 base model for single test case
49 ### instance attributes
51 - project_name (default: 'functest')
62 |-------------------|--------------------------------------------|
63 | run(**kwargs) | run the test case |
64 | check_criteria() | interpret the results of the test case |
65 | push_to_db() | push the results of the test case to the DB|
70 - the subclasses must override the default implementation which is false on purpose
71 - the new implementation must set the following attributes to push the results to DB:
79 | Status code | Returned when |
80 |--------------------|---------------------|
81 | EX_OK | everything is OK |
82 | EX_RUN_ERROR | run() failed |
83 | EX_TESTCASE_FAILED | results are false |
84 | EX_PUSH_TO_DB_ERROR| push_to_db() failed |
90 module = importlib.import_module(run_dict['module'])
91 cls = getattr(module, run_dict['class'])
92 test_dict = ft_utils.get_dict_by_test(test_name)
93 test_case = cls(**test_dict)
95 kwargs = run_dict['args']
96 result = test_case.run(**kwargs)
98 result = test_case.run()
99 if result == testcase.TestCase.EX_OK:
100 if GlobalVariables.REPORT_FLAG:
101 test_case.push_to_db()
102 result = test_case.check_criteria()
107 ## Your first test case
113 #!/usr/bin/env python
117 from functest.core import testcase
119 class Test(testcase.TestCase):
121 def run(self, **kwargs):
122 self.start_time = time.time()
124 self.criteria = 'PASS'
125 self.stop_time = time.time()
126 return testcase.TestCase.EX_OK
130 ### functest/ci/testcases.yaml
134 project_name: functest
135 criteria: 'status == "PASS"'
152 base model for single feature
158 |-------------------|---------------------------|
159 | run(**kwargs) | run the feature |
160 | execute(**kwargs) | execute the Python method |
165 - allows executing any Python method by calling execute()
166 - sets the following attributes required to push the results to DB:
170 - doesn't fulfill details when pushing the results to the DB.
173 ### execute(**kwargs)
175 - the subclasses must override the default implementation which is false on purpose
176 - the new implementation must return 0 if success or anything else if failure.
180 ## Your second test case
186 #!/usr/bin/env python
188 from functest.core import feature
190 class Test(feature.Feature):
192 def execute(self, **kwargs):
198 ### functest/ci/testcases.yaml
202 project_name: functest
203 criteria: 'status == "PASS"'
220 class designed to run any bash command
223 ### execute(**kwargs)
225 execute the cmd passed as arg.
229 ## Your third test case
232 ### functest/ci/testcases.yaml
236 project_name: functest
237 criteria: 'status == "PASS"'
245 module: 'functest.core.feature'
248 cmd: 'echo Hello World; exit 0'
258 - __to finish VNF abstraction (coverage + pylint)__
260 - to manage criteria as written in testcases.yaml
262 Please see [Functest Euphrates page](https://wiki.opnfv.org/display/functest/Functest+Euphrates+page) for more details