forked from robotframework/robotframework
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestcase.py
More file actions
146 lines (114 loc) · 4.49 KB
/
testcase.py
File metadata and controls
146 lines (114 loc) · 4.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# Copyright 2008-2015 Nokia Networks
# Copyright 2016- Robot Framework Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from robot.utils import setter
from .body import Body
from .fixture import create_fixture
from .itemlist import ItemList
from .keyword import Keyword, Keywords
from .modelobject import ModelObject
from .tags import Tags
class TestCase(ModelObject):
"""Base model for a single test case.
Extended by :class:`robot.running.model.TestCase` and
:class:`robot.result.model.TestCase`.
"""
body_class = Body
fixture_class = Keyword
repr_args = ('name',)
__slots__ = ['parent', 'name', 'doc', 'timeout']
def __init__(self, name='', doc='', tags=None, timeout=None, parent=None):
self.name = name
self.doc = doc
self.timeout = timeout
self.tags = tags
self.parent = parent
self.body = None
self.setup = None
self.teardown = None
@setter
def body(self, body):
"""Test case body as a :class:`~.Body` object."""
return self.body_class(self, body)
@setter
def tags(self, tags):
"""Test tags as a :class:`~.model.tags.Tags` object."""
return Tags(tags)
@setter
def setup(self, setup):
"""Test setup as a :class:`~.model.keyword.Keyword` object.
This attribute is a ``Keyword`` object also when a test has no setup
but in that case its truth value is ``False``.
Setup can be modified by setting attributes directly::
test.setup.name = 'Example'
test.setup.args = ('First', 'Second')
Alternatively the :meth:`config` method can be used to set multiple
attributes in one call::
test.setup.config(name='Example', args=('First', 'Second'))
The easiest way to reset the whole setup is setting it to ``None``.
It will automatically recreate the underlying ``Keyword`` object::
test.setup = None
New in Robot Framework 4.0. Earlier setup was accessed like
``test.keywords.setup``.
"""
return create_fixture(setup, self, Keyword.SETUP)
@setter
def teardown(self, teardown):
"""Test teardown as a :class:`~.model.keyword.Keyword` object.
See :attr:`setup` for more information.
"""
return create_fixture(teardown, self, Keyword.TEARDOWN)
@property
def keywords(self):
"""Deprecated since Robot Framework 4.0
Use :attr:`body`, :attr:`setup` or :attr:`teardown` instead.
"""
keywords = [self.setup] + list(self.body) + [self.teardown]
return Keywords(self, [kw for kw in keywords if kw])
@keywords.setter
def keywords(self, keywords):
Keywords.raise_deprecation_error()
@property
def id(self):
"""Test case id in format like ``s1-t3``.
See :attr:`TestSuite.id <robot.model.testsuite.TestSuite.id>` for
more information.
"""
if not self.parent:
return 't1'
return '%s-t%d' % (self.parent.id, self.parent.tests.index(self)+1)
@property
def longname(self):
"""Test name prefixed with the long name of the parent suite."""
if not self.parent:
return self.name
return '%s.%s' % (self.parent.longname, self.name)
@property
def source(self):
return self.parent.source if self.parent is not None else None
def visit(self, visitor):
""":mod:`Visitor interface <robot.model.visitor>` entry-point."""
visitor.visit_test(self)
def __str__(self):
return self.name
class TestCases(ItemList):
__slots__ = []
def __init__(self, test_class=TestCase, parent=None, tests=None):
ItemList.__init__(self, test_class, {'parent': parent}, tests)
def _check_type_and_set_attrs(self, *tests):
tests = ItemList._check_type_and_set_attrs(self, *tests)
for test in tests:
for visitor in test.parent._visitors:
test.visit(visitor)
return tests