| 1 | import os |
|---|
| 2 | import textwrap |
|---|
| 3 | from optparse import OptionConflictError |
|---|
| 4 | from warnings import warn |
|---|
| 5 | from nose.util import tolist |
|---|
| 6 | |
|---|
| 7 | class Plugin(object): |
|---|
| 8 | """Base class for nose plugins. It's recommended but not *necessary* to |
|---|
| 9 | subclass this class to create a plugin, but all plugins *must* implement |
|---|
| 10 | `options(self, parser, env)` and `configure(self, options, conf)`, and |
|---|
| 11 | must have the attributes `enabled`, `name` and `score`. The `name` |
|---|
| 12 | attribute may contain hyphens ('-'). |
|---|
| 13 | |
|---|
| 14 | Plugins should not be enabled by default. |
|---|
| 15 | |
|---|
| 16 | Subclassing Plugin (and calling the superclass methods in |
|---|
| 17 | __init__, configure, and options, if you override them) will give |
|---|
| 18 | your plugin some friendly default behavior: |
|---|
| 19 | |
|---|
| 20 | * A --with-$name option will be added to the command line interface |
|---|
| 21 | to enable the plugin, and a corresponding environment variable |
|---|
| 22 | will be used as the default value. The plugin class's docstring |
|---|
| 23 | will be used as the help for this option. |
|---|
| 24 | * The plugin will not be enabled unless this option is selected by |
|---|
| 25 | the user. |
|---|
| 26 | """ |
|---|
| 27 | can_configure = False |
|---|
| 28 | enabled = False |
|---|
| 29 | enableOpt = None |
|---|
| 30 | name = None |
|---|
| 31 | score = 100 |
|---|
| 32 | |
|---|
| 33 | def __init__(self): |
|---|
| 34 | if self.name is None: |
|---|
| 35 | self.name = self.__class__.__name__.lower() |
|---|
| 36 | if self.enableOpt is None: |
|---|
| 37 | self.enableOpt = "enable_plugin_%s" % self.name.replace('-', '_') |
|---|
| 38 | |
|---|
| 39 | def addOptions(self, parser, env=None): |
|---|
| 40 | """Add command-line options for this plugin. |
|---|
| 41 | |
|---|
| 42 | The base plugin class adds --with-$name by default, used to enable the |
|---|
| 43 | plugin. |
|---|
| 44 | |
|---|
| 45 | .. warning :: Don't implement addOptions unless you want to override |
|---|
| 46 | all default option handling behavior, including |
|---|
| 47 | warnings for conflicting options. Implement |
|---|
| 48 | :meth:`options |
|---|
| 49 | <nose.plugins.base.IPluginInterface.options>` |
|---|
| 50 | instead. |
|---|
| 51 | """ |
|---|
| 52 | self.add_options(parser, env) |
|---|
| 53 | |
|---|
| 54 | def add_options(self, parser, env=None): |
|---|
| 55 | """Non-camel-case version of func name for backwards compatibility. |
|---|
| 56 | |
|---|
| 57 | .. warning :: |
|---|
| 58 | |
|---|
| 59 | DEPRECATED: Do not use this method, |
|---|
| 60 | use :meth:`options <nose.plugins.base.IPluginInterface.options>` |
|---|
| 61 | instead. |
|---|
| 62 | |
|---|
| 63 | """ |
|---|
| 64 | # FIXME raise deprecation warning if wasn't called by wrapper |
|---|
| 65 | if env is None: |
|---|
| 66 | env = os.environ |
|---|
| 67 | try: |
|---|
| 68 | self.options(parser, env) |
|---|
| 69 | self.can_configure = True |
|---|
| 70 | except OptionConflictError, e: |
|---|
| 71 | warn("Plugin %s has conflicting option string: %s and will " |
|---|
| 72 | "be disabled" % (self, e), RuntimeWarning) |
|---|
| 73 | self.enabled = False |
|---|
| 74 | self.can_configure = False |
|---|
| 75 | |
|---|
| 76 | def options(self, parser, env): |
|---|
| 77 | """Register commandline options. |
|---|
| 78 | |
|---|
| 79 | Implement this method for normal options behavior with protection from |
|---|
| 80 | OptionConflictErrors. If you override this method and want the default |
|---|
| 81 | --with-$name option to be registered, be sure to call super(). |
|---|
| 82 | """ |
|---|
| 83 | env_opt = 'NOSE_WITH_%s' % self.name.upper() |
|---|
| 84 | env_opt = env_opt.replace('-', '_') |
|---|
| 85 | parser.add_option("--with-%s" % self.name, |
|---|
| 86 | action="store_true", |
|---|
| 87 | dest=self.enableOpt, |
|---|
| 88 | default=env.get(env_opt), |
|---|
| 89 | help="Enable plugin %s: %s [%s]" % |
|---|
| 90 | (self.__class__.__name__, self.help(), env_opt)) |
|---|
| 91 | |
|---|
| 92 | def configure(self, options, conf): |
|---|
| 93 | """Configure the plugin and system, based on selected options. |
|---|
| 94 | |
|---|
| 95 | The base plugin class sets the plugin to enabled if the enable option |
|---|
| 96 | for the plugin (self.enableOpt) is true. |
|---|
| 97 | """ |
|---|
| 98 | if not self.can_configure: |
|---|
| 99 | return |
|---|
| 100 | self.conf = conf |
|---|
| 101 | if hasattr(options, self.enableOpt): |
|---|
| 102 | self.enabled = getattr(options, self.enableOpt) |
|---|
| 103 | |
|---|
| 104 | def help(self): |
|---|
| 105 | """Return help for this plugin. This will be output as the help |
|---|
| 106 | section of the --with-$name option that enables the plugin. |
|---|
| 107 | """ |
|---|
| 108 | if self.__class__.__doc__: |
|---|
| 109 | # doc sections are often indented; compress the spaces |
|---|
| 110 | return textwrap.dedent(self.__class__.__doc__) |
|---|
| 111 | return "(no help available)" |
|---|
| 112 | |
|---|
| 113 | # Compatiblity shim |
|---|
| 114 | def tolist(self, val): |
|---|
| 115 | warn("Plugin.tolist is deprecated. Use nose.util.tolist instead", |
|---|
| 116 | DeprecationWarning) |
|---|
| 117 | return tolist(val) |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | class IPluginInterface(object): |
|---|
| 121 | """ |
|---|
| 122 | IPluginInteface describes the plugin API. Do not subclass or use this |
|---|
| 123 | class directly. |
|---|
| 124 | """ |
|---|
| 125 | def __new__(cls, *arg, **kw): |
|---|
| 126 | raise TypeError("IPluginInterface class is for documentation only") |
|---|
| 127 | |
|---|
| 128 | def addOptions(self, parser, env): |
|---|
| 129 | """Called to allow plugin to register command-line options with the |
|---|
| 130 | parser. DO NOT return a value from this method unless you want to stop |
|---|
| 131 | all other plugins from setting their options. |
|---|
| 132 | |
|---|
| 133 | .. warning :: |
|---|
| 134 | |
|---|
| 135 | DEPRECATED -- implement |
|---|
| 136 | :meth:`options <nose.plugins.base.IPluginInterface.options>` instead. |
|---|
| 137 | """ |
|---|
| 138 | pass |
|---|
| 139 | add_options = addOptions |
|---|
| 140 | add_options.deprecated = True |
|---|
| 141 | |
|---|
| 142 | def addDeprecated(self, test): |
|---|
| 143 | """Called when a deprecated test is seen. DO NOT return a value |
|---|
| 144 | unless you want to stop other plugins from seeing the deprecated |
|---|
| 145 | test. |
|---|
| 146 | |
|---|
| 147 | .. warning :: DEPRECATED -- check error class in addError instead |
|---|
| 148 | """ |
|---|
| 149 | pass |
|---|
| 150 | addDeprecated.deprecated = True |
|---|
| 151 | |
|---|
| 152 | def addError(self, test, err): |
|---|
| 153 | """Called when a test raises an uncaught exception. DO NOT return a |
|---|
| 154 | value unless you want to stop other plugins from seeing that the |
|---|
| 155 | test has raised an error. |
|---|
| 156 | |
|---|
| 157 | :param test: the test case |
|---|
| 158 | :type test: :class:`nose.case.Test` |
|---|
| 159 | :param err: sys.exc_info() tuple |
|---|
| 160 | :type err: 3-tuple |
|---|
| 161 | """ |
|---|
| 162 | pass |
|---|
| 163 | addError.changed = True |
|---|
| 164 | |
|---|
| 165 | def addFailure(self, test, err): |
|---|
| 166 | """Called when a test fails. DO NOT return a value unless you |
|---|
| 167 | want to stop other plugins from seeing that the test has failed. |
|---|
| 168 | |
|---|
| 169 | :param test: the test case |
|---|
| 170 | :type test: :class:`nose.case.Test` |
|---|
| 171 | :param err: 3-tuple |
|---|
| 172 | :type err: sys.exc_info() tuple |
|---|
| 173 | """ |
|---|
| 174 | pass |
|---|
| 175 | addFailure.changed = True |
|---|
| 176 | |
|---|
| 177 | def addSkip(self, test): |
|---|
| 178 | """Called when a test is skipped. DO NOT return a value unless |
|---|
| 179 | you want to stop other plugins from seeing the skipped test. |
|---|
| 180 | |
|---|
| 181 | .. warning:: DEPRECATED -- check error class in addError instead |
|---|
| 182 | """ |
|---|
| 183 | pass |
|---|
| 184 | addSkip.deprecated = True |
|---|
| 185 | |
|---|
| 186 | def addSuccess(self, test): |
|---|
| 187 | """Called when a test passes. DO NOT return a value unless you |
|---|
| 188 | want to stop other plugins from seeing the passing test. |
|---|
| 189 | |
|---|
| 190 | :param test: the test case |
|---|
| 191 | :type test: :class:`nose.case.Test` |
|---|
| 192 | """ |
|---|
| 193 | pass |
|---|
| 194 | addSuccess.changed = True |
|---|
| 195 | |
|---|
| 196 | def afterContext(self): |
|---|
| 197 | """Called after a context (generally a module) has been |
|---|
| 198 | lazy-loaded, imported, setup, had its tests loaded and |
|---|
| 199 | executed, and torn down. |
|---|
| 200 | """ |
|---|
| 201 | pass |
|---|
| 202 | afterContext._new = True |
|---|
| 203 | |
|---|
| 204 | def afterDirectory(self, path): |
|---|
| 205 | """Called after all tests have been loaded from directory at path |
|---|
| 206 | and run. |
|---|
| 207 | |
|---|
| 208 | :param path: the directory that has finished processing |
|---|
| 209 | :type path: string |
|---|
| 210 | """ |
|---|
| 211 | pass |
|---|
| 212 | afterDirectory._new = True |
|---|
| 213 | |
|---|
| 214 | def afterImport(self, filename, module): |
|---|
| 215 | """Called after module is imported from filename. afterImport |
|---|
| 216 | is called even if the import failed. |
|---|
| 217 | |
|---|
| 218 | :param filename: The file that was loaded |
|---|
| 219 | :type filename: string |
|---|
| 220 | :param filename: The name of the module |
|---|
| 221 | :type module: string |
|---|
| 222 | """ |
|---|
| 223 | pass |
|---|
| 224 | afterImport._new = True |
|---|
| 225 | |
|---|
| 226 | def afterTest(self, test): |
|---|
| 227 | """Called after the test has been run and the result recorded |
|---|
| 228 | (after stopTest). |
|---|
| 229 | |
|---|
| 230 | :param test: the test case |
|---|
| 231 | :type test: :class:`nose.case.Test` |
|---|
| 232 | """ |
|---|
| 233 | pass |
|---|
| 234 | afterTest._new = True |
|---|
| 235 | |
|---|
| 236 | def beforeContext(self): |
|---|
| 237 | """Called before a context (generally a module) is |
|---|
| 238 | examined. Because the context is not yet loaded, plugins don't |
|---|
| 239 | get to know what the context is; so any context operations |
|---|
| 240 | should use a stack that is pushed in `beforeContext` and popped |
|---|
| 241 | in `afterContext` to ensure they operate symmetrically. |
|---|
| 242 | |
|---|
| 243 | `beforeContext` and `afterContext` are mainly useful for tracking |
|---|
| 244 | and restoring global state around possible changes from within a |
|---|
| 245 | context, whatever the context may be. If you need to operate on |
|---|
| 246 | contexts themselves, see `startContext` and `stopContext`, which |
|---|
| 247 | are passed the context in question, but are called after |
|---|
| 248 | it has been loaded (imported in the module case). |
|---|
| 249 | """ |
|---|
| 250 | pass |
|---|
| 251 | beforeContext._new = True |
|---|
| 252 | |
|---|
| 253 | def beforeDirectory(self, path): |
|---|
| 254 | """Called before tests are loaded from directory at path. |
|---|
| 255 | |
|---|
| 256 | :param path: the directory that is about to be processed |
|---|
| 257 | """ |
|---|
| 258 | pass |
|---|
| 259 | beforeDirectory._new = True |
|---|
| 260 | |
|---|
| 261 | def beforeImport(self, filename, module): |
|---|
| 262 | """Called before module is imported from filename. |
|---|
| 263 | |
|---|
| 264 | :param filename: The file that will be loaded |
|---|
| 265 | :param module: The name of the module found in file |
|---|
| 266 | :type module: string |
|---|
| 267 | """ |
|---|
| 268 | beforeImport._new = True |
|---|
| 269 | |
|---|
| 270 | def beforeTest(self, test): |
|---|
| 271 | """Called before the test is run (before startTest). |
|---|
| 272 | |
|---|
| 273 | :param test: the test case |
|---|
| 274 | :type test: :class:`nose.case.Test` |
|---|
| 275 | """ |
|---|
| 276 | pass |
|---|
| 277 | beforeTest._new = True |
|---|
| 278 | |
|---|
| 279 | def begin(self): |
|---|
| 280 | """Called before any tests are collected or run. Use this to |
|---|
| 281 | perform any setup needed before testing begins. |
|---|
| 282 | """ |
|---|
| 283 | pass |
|---|
| 284 | |
|---|
| 285 | def configure(self, options, conf): |
|---|
| 286 | """Called after the command line has been parsed, with the |
|---|
| 287 | parsed options and the config container. Here, implement any |
|---|
| 288 | config storage or changes to state or operation that are set |
|---|
| 289 | by command line options. |
|---|
| 290 | |
|---|
| 291 | DO NOT return a value from this method unless you want to |
|---|
| 292 | stop all other plugins from being configured. |
|---|
| 293 | """ |
|---|
| 294 | pass |
|---|
| 295 | |
|---|
| 296 | def finalize(self, result): |
|---|
| 297 | """Called after all report output, including output from all |
|---|
| 298 | plugins, has been sent to the stream. Use this to print final |
|---|
| 299 | test results or perform final cleanup. Return None to allow |
|---|
| 300 | other plugins to continue printing, or any other value to stop |
|---|
| 301 | them. |
|---|
| 302 | |
|---|
| 303 | :param result: test result object |
|---|
| 304 | |
|---|
| 305 | .. Note:: When tests are run under a test runner other than |
|---|
| 306 | :class:`nose.core.TextTestRunner`, such as |
|---|
| 307 | via ``python setup.py test``, this method may be called |
|---|
| 308 | **before** the default report output is sent. |
|---|
| 309 | """ |
|---|
| 310 | pass |
|---|
| 311 | |
|---|
| 312 | def describeTest(self, test): |
|---|
| 313 | """Return a test description. |
|---|
| 314 | |
|---|
| 315 | Called by :meth:`nose.case.Test.shortDescription`. |
|---|
| 316 | |
|---|
| 317 | :param test: the test case |
|---|
| 318 | :type test: :class:`nose.case.Test` |
|---|
| 319 | """ |
|---|
| 320 | pass |
|---|
| 321 | describeTest._new = True |
|---|
| 322 | |
|---|
| 323 | def formatError(self, test, err): |
|---|
| 324 | """Called in result.addError, before plugin.addError. If you |
|---|
| 325 | want to replace or modify the error tuple, return a new error |
|---|
| 326 | tuple. |
|---|
| 327 | |
|---|
| 328 | :param test: the test case |
|---|
| 329 | :type test: :class:`nose.case.Test` |
|---|
| 330 | :param err: sys.exc_info() tuple |
|---|
| 331 | :type err: 3-tuple |
|---|
| 332 | """ |
|---|
| 333 | pass |
|---|
| 334 | formatError._new = True |
|---|
| 335 | formatError.chainable = True |
|---|
| 336 | # test arg is not chainable |
|---|
| 337 | formatError.static_args = (True, False) |
|---|
| 338 | |
|---|
| 339 | def formatFailure(self, test, err): |
|---|
| 340 | """Called in result.addFailure, before plugin.addFailure. If you |
|---|
| 341 | want to replace or modify the error tuple, return a new error |
|---|
| 342 | tuple. Because this method is chainable, you must return the |
|---|
| 343 | test as well, so you you'll return something like:: |
|---|
| 344 | |
|---|
| 345 | return (test, err) |
|---|
| 346 | |
|---|
| 347 | :param test: the test case |
|---|
| 348 | :type test: :class:`nose.case.Test` |
|---|
| 349 | :param err: sys.exc_info() tuple |
|---|
| 350 | :type err: 3-tuple |
|---|
| 351 | """ |
|---|
| 352 | pass |
|---|
| 353 | formatFailure._new = True |
|---|
| 354 | formatFailure.chainable = True |
|---|
| 355 | # test arg is not chainable |
|---|
| 356 | formatFailure.static_args = (True, False) |
|---|
| 357 | |
|---|
| 358 | def handleError(self, test, err): |
|---|
| 359 | """Called on addError. To handle the error yourself and prevent normal |
|---|
| 360 | error processing, return a true value. |
|---|
| 361 | |
|---|
| 362 | :param test: the test case |
|---|
| 363 | :type test: :class:`nose.case.Test` |
|---|
| 364 | :param err: sys.exc_info() tuple |
|---|
| 365 | :type err: 3-tuple |
|---|
| 366 | """ |
|---|
| 367 | pass |
|---|
| 368 | handleError._new = True |
|---|
| 369 | |
|---|
| 370 | def handleFailure(self, test, err): |
|---|
| 371 | """Called on addFailure. To handle the failure yourself and |
|---|
| 372 | prevent normal failure processing, return a true value. |
|---|
| 373 | |
|---|
| 374 | :param test: the test case |
|---|
| 375 | :type test: :class:`nose.case.Test` |
|---|
| 376 | :param err: sys.exc_info() tuple |
|---|
| 377 | :type err: 3-tuple |
|---|
| 378 | """ |
|---|
| 379 | pass |
|---|
| 380 | handleFailure._new = True |
|---|
| 381 | |
|---|
| 382 | def loadTestsFromDir(self, path): |
|---|
| 383 | """Return iterable of tests from a directory. May be a |
|---|
| 384 | generator. Each item returned must be a runnable |
|---|
| 385 | unittest.TestCase (or subclass) instance or suite instance. |
|---|
| 386 | Return None if your plugin cannot collect any tests from |
|---|
| 387 | directory. |
|---|
| 388 | |
|---|
| 389 | :param path: The path to the directory. |
|---|
| 390 | """ |
|---|
| 391 | pass |
|---|
| 392 | loadTestsFromDir.generative = True |
|---|
| 393 | loadTestsFromDir._new = True |
|---|
| 394 | |
|---|
| 395 | def loadTestsFromModule(self, module, path=None): |
|---|
| 396 | """Return iterable of tests in a module. May be a |
|---|
| 397 | generator. Each item returned must be a runnable |
|---|
| 398 | unittest.TestCase (or subclass) instance. |
|---|
| 399 | Return None if your plugin cannot |
|---|
| 400 | collect any tests from module. |
|---|
| 401 | |
|---|
| 402 | :param module: The module object |
|---|
| 403 | :type module: python module |
|---|
| 404 | :param path: the path of the module to search, to distinguish from |
|---|
| 405 | namespace package modules |
|---|
| 406 | |
|---|
| 407 | .. note:: |
|---|
| 408 | |
|---|
| 409 | NEW. The ``path`` parameter will only be passed by nose 0.11 |
|---|
| 410 | or above. |
|---|
| 411 | """ |
|---|
| 412 | pass |
|---|
| 413 | loadTestsFromModule.generative = True |
|---|
| 414 | |
|---|
| 415 | def loadTestsFromName(self, name, module=None, importPath=None): |
|---|
| 416 | """Return tests in this file or module. Return None if you are not able |
|---|
| 417 | to load any tests, or an iterable if you are. May be a |
|---|
| 418 | generator. |
|---|
| 419 | |
|---|
| 420 | :param name: The test name. May be a file or module name plus a test |
|---|
| 421 | callable. Use split_test_name to split into parts. Or it might |
|---|
| 422 | be some crazy name of your own devising, in which case, do |
|---|
| 423 | whatever you want. |
|---|
| 424 | :param module: Module from which the name is to be loaded |
|---|
| 425 | :param importPath: Path from which file (must be a python module) was |
|---|
| 426 | found |
|---|
| 427 | |
|---|
| 428 | .. warning:: DEPRECATED: this argument will NOT be passed. |
|---|
| 429 | """ |
|---|
| 430 | pass |
|---|
| 431 | loadTestsFromName.generative = True |
|---|
| 432 | |
|---|
| 433 | def loadTestsFromNames(self, names, module=None): |
|---|
| 434 | """Return a tuple of (tests loaded, remaining names). Return |
|---|
| 435 | None if you are not able to load any tests. Multiple plugins |
|---|
| 436 | may implement loadTestsFromNames; the remaining name list from |
|---|
| 437 | each will be passed to the next as input. |
|---|
| 438 | |
|---|
| 439 | :param names: List of test names. |
|---|
| 440 | :type names: iterable |
|---|
| 441 | :param module: Module from which the names are to be loaded |
|---|
| 442 | """ |
|---|
| 443 | pass |
|---|
| 444 | loadTestsFromNames._new = True |
|---|
| 445 | loadTestsFromNames.chainable = True |
|---|
| 446 | |
|---|
| 447 | def loadTestsFromFile(self, filename): |
|---|
| 448 | """Return tests in this file. Return None if you are not |
|---|
| 449 | interested in loading any tests, or an iterable if you are and |
|---|
| 450 | can load some. May be a generator. *If you are interested in |
|---|
| 451 | loading tests from the file and encounter no errors, but find |
|---|
| 452 | no tests, yield False or return [False].* |
|---|
| 453 | |
|---|
| 454 | .. Note:: This method replaces loadTestsFromPath from the 0.9 |
|---|
| 455 | API. |
|---|
| 456 | |
|---|
| 457 | :param filename: The full path to the file or directory. |
|---|
| 458 | """ |
|---|
| 459 | pass |
|---|
| 460 | loadTestsFromFile.generative = True |
|---|
| 461 | loadTestsFromFile._new = True |
|---|
| 462 | |
|---|
| 463 | def loadTestsFromPath(self, path): |
|---|
| 464 | """ |
|---|
| 465 | .. warning:: DEPRECATED -- use loadTestsFromFile instead |
|---|
| 466 | """ |
|---|
| 467 | pass |
|---|
| 468 | loadTestsFromPath.deprecated = True |
|---|
| 469 | |
|---|
| 470 | def loadTestsFromTestCase(self, cls): |
|---|
| 471 | """Return tests in this test case class. Return None if you are |
|---|
| 472 | not able to load any tests, or an iterable if you are. May be a |
|---|
| 473 | generator. |
|---|
| 474 | |
|---|
| 475 | :param cls: The test case class. Must be subclass of |
|---|
| 476 | :class:`unittest.TestCase`. |
|---|
| 477 | """ |
|---|
| 478 | pass |
|---|
| 479 | loadTestsFromTestCase.generative = True |
|---|
| 480 | |
|---|
| 481 | def loadTestsFromTestClass(self, cls): |
|---|
| 482 | """Return tests in this test class. Class will *not* be a |
|---|
| 483 | unittest.TestCase subclass. Return None if you are not able to |
|---|
| 484 | load any tests, an iterable if you are. May be a generator. |
|---|
| 485 | |
|---|
| 486 | :param cls: The test case class. Must be **not** be subclass of |
|---|
| 487 | :class:`unittest.TestCase`. |
|---|
| 488 | """ |
|---|
| 489 | pass |
|---|
| 490 | loadTestsFromTestClass._new = True |
|---|
| 491 | loadTestsFromTestClass.generative = True |
|---|
| 492 | |
|---|
| 493 | def makeTest(self, obj, parent): |
|---|
| 494 | """Given an object and its parent, return or yield one or more |
|---|
| 495 | test cases. Each test must be a unittest.TestCase (or subclass) |
|---|
| 496 | instance. This is called before default test loading to allow |
|---|
| 497 | plugins to load an alternate test case or cases for an |
|---|
| 498 | object. May be a generator. |
|---|
| 499 | |
|---|
| 500 | :param obj: The object to be made into a test |
|---|
| 501 | :param parent: The parent of obj (eg, for a method, the class) |
|---|
| 502 | """ |
|---|
| 503 | pass |
|---|
| 504 | makeTest._new = True |
|---|
| 505 | makeTest.generative = True |
|---|
| 506 | |
|---|
| 507 | def options(self, parser, env): |
|---|
| 508 | """Called to allow plugin to register command line |
|---|
| 509 | options with the parser. |
|---|
| 510 | |
|---|
| 511 | DO NOT return a value from this method unless you want to stop |
|---|
| 512 | all other plugins from setting their options. |
|---|
| 513 | |
|---|
| 514 | :param parser: options parser instance |
|---|
| 515 | :type parser: :class:`ConfigParser.ConfigParser` |
|---|
| 516 | :param env: environment, default is os.environ |
|---|
| 517 | """ |
|---|
| 518 | pass |
|---|
| 519 | options._new = True |
|---|
| 520 | |
|---|
| 521 | def prepareTest(self, test): |
|---|
| 522 | """Called before the test is run by the test runner. Please |
|---|
| 523 | note the article *the* in the previous sentence: prepareTest |
|---|
| 524 | is called *only once*, and is passed the test case or test |
|---|
| 525 | suite that the test runner will execute. It is *not* called |
|---|
| 526 | for each individual test case. If you return a non-None value, |
|---|
| 527 | that return value will be run as the test. Use this hook to |
|---|
| 528 | wrap or decorate the test with another function. If you need |
|---|
| 529 | to modify or wrap individual test cases, use `prepareTestCase` |
|---|
| 530 | instead. |
|---|
| 531 | |
|---|
| 532 | :param test: the test case |
|---|
| 533 | :type test: :class:`nose.case.Test` |
|---|
| 534 | """ |
|---|
| 535 | pass |
|---|
| 536 | |
|---|
| 537 | def prepareTestCase(self, test): |
|---|
| 538 | """Prepare or wrap an individual test case. Called before |
|---|
| 539 | execution of the test. The test passed here is a |
|---|
| 540 | nose.case.Test instance; the case to be executed is in the |
|---|
| 541 | test attribute of the passed case. To modify the test to be |
|---|
| 542 | run, you should return a callable that takes one argument (the |
|---|
| 543 | test result object) -- it is recommended that you *do not* |
|---|
| 544 | side-effect the nose.case.Test instance you have been passed. |
|---|
| 545 | |
|---|
| 546 | Keep in mind that when you replace the test callable you are |
|---|
| 547 | replacing the run() method of the test case -- including the |
|---|
| 548 | exception handling and result calls, etc. |
|---|
| 549 | |
|---|
| 550 | :param test: the test case |
|---|
| 551 | :type test: :class:`nose.case.Test` |
|---|
| 552 | """ |
|---|
| 553 | pass |
|---|
| 554 | prepareTestCase._new = True |
|---|
| 555 | |
|---|
| 556 | def prepareTestLoader(self, loader): |
|---|
| 557 | """Called before tests are loaded. To replace the test loader, |
|---|
| 558 | return a test loader. To allow other plugins to process the |
|---|
| 559 | test loader, return None. Only one plugin may replace the test |
|---|
| 560 | loader. Only valid when using nose.TestProgram. |
|---|
| 561 | |
|---|
| 562 | :param loader: :class:`nose.loader.TestLoader` |
|---|
| 563 | (or other loader) instance |
|---|
| 564 | """ |
|---|
| 565 | pass |
|---|
| 566 | prepareTestLoader._new = True |
|---|
| 567 | |
|---|
| 568 | def prepareTestResult(self, result): |
|---|
| 569 | """Called before the first test is run. To use a different |
|---|
| 570 | test result handler for all tests than the given result, |
|---|
| 571 | return a test result handler. NOTE however that this handler |
|---|
| 572 | will only be seen by tests, that is, inside of the result |
|---|
| 573 | proxy system. The TestRunner and TestProgram -- whether nose's |
|---|
| 574 | or other -- will continue to see the original result |
|---|
| 575 | handler. For this reason, it is usually better to monkeypatch |
|---|
| 576 | the result (for instance, if you want to handle some |
|---|
| 577 | exceptions in a unique way). Only one plugin may replace the |
|---|
| 578 | result, but many may monkeypatch it. If you want to |
|---|
| 579 | monkeypatch and stop other plugins from doing so, monkeypatch |
|---|
| 580 | and return the patched result. |
|---|
| 581 | |
|---|
| 582 | :param result: :class:`nose.result.TextTestResult` |
|---|
| 583 | (or other result) instance |
|---|
| 584 | """ |
|---|
| 585 | pass |
|---|
| 586 | prepareTestResult._new = True |
|---|
| 587 | |
|---|
| 588 | def prepareTestRunner(self, runner): |
|---|
| 589 | """Called before tests are run. To replace the test runner, |
|---|
| 590 | return a test runner. To allow other plugins to process the |
|---|
| 591 | test runner, return None. Only valid when using nose.TestProgram. |
|---|
| 592 | |
|---|
| 593 | :param runner: :class:`nose.core.TextTestRunner` |
|---|
| 594 | (or other runner) instance |
|---|
| 595 | """ |
|---|
| 596 | pass |
|---|
| 597 | prepareTestRunner._new = True |
|---|
| 598 | |
|---|
| 599 | def report(self, stream): |
|---|
| 600 | """Called after all error output has been printed. Print your |
|---|
| 601 | plugin's report to the provided stream. Return None to allow |
|---|
| 602 | other plugins to print reports, any other value to stop them. |
|---|
| 603 | |
|---|
| 604 | :param stream: stream object; send your output here |
|---|
| 605 | :type stream: file-like object |
|---|
| 606 | """ |
|---|
| 607 | pass |
|---|
| 608 | |
|---|
| 609 | def setOutputStream(self, stream): |
|---|
| 610 | """Called before test output begins. To direct test output to a |
|---|
| 611 | new stream, return a stream object, which must implement a |
|---|
| 612 | `write(msg)` method. If you only want to note the stream, not |
|---|
| 613 | capture or redirect it, then return None. |
|---|
| 614 | |
|---|
| 615 | :param stream: stream object; send your output here |
|---|
| 616 | :type stream: file-like object |
|---|
| 617 | """ |
|---|
| 618 | |
|---|
| 619 | def startContext(self, context): |
|---|
| 620 | """Called before context setup and the running of tests in the |
|---|
| 621 | context. Note that tests have already been *loaded* from the |
|---|
| 622 | context before this call. |
|---|
| 623 | |
|---|
| 624 | :param context: the context about to be setup. May be a module or |
|---|
| 625 | class, or any other object that contains tests. |
|---|
| 626 | """ |
|---|
| 627 | pass |
|---|
| 628 | startContext._new = True |
|---|
| 629 | |
|---|
| 630 | def startTest(self, test): |
|---|
| 631 | """Called before each test is run. DO NOT return a value unless |
|---|
| 632 | you want to stop other plugins from seeing the test start. |
|---|
| 633 | |
|---|
| 634 | :param err: sys.exc_info() tuple |
|---|
| 635 | :type err: 3-tuple |
|---|
| 636 | """ |
|---|
| 637 | pass |
|---|
| 638 | |
|---|
| 639 | def stopContext(self, context): |
|---|
| 640 | """Called after the tests in a context have run and the |
|---|
| 641 | context has been torn down. |
|---|
| 642 | |
|---|
| 643 | :param context: the context about to be setup. May be a module or |
|---|
| 644 | class, or any other object that contains tests. |
|---|
| 645 | """ |
|---|
| 646 | pass |
|---|
| 647 | stopContext._new = True |
|---|
| 648 | |
|---|
| 649 | def stopTest(self, test): |
|---|
| 650 | """Called after each test is run. DO NOT return a value unless |
|---|
| 651 | you want to stop other plugins from seeing that the test has stopped. |
|---|
| 652 | |
|---|
| 653 | :param err: sys.exc_info() tuple |
|---|
| 654 | :type err: 3-tuple |
|---|
| 655 | """ |
|---|
| 656 | pass |
|---|
| 657 | |
|---|
| 658 | def testName(self, test): |
|---|
| 659 | """Return a short test name. Called by `nose.case.Test.__str__`. |
|---|
| 660 | |
|---|
| 661 | :param err: sys.exc_info() tuple |
|---|
| 662 | :type err: 3-tuple |
|---|
| 663 | """ |
|---|
| 664 | pass |
|---|
| 665 | testName._new = True |
|---|
| 666 | |
|---|
| 667 | def wantClass(self, cls): |
|---|
| 668 | """Return true if you want the main test selector to collect |
|---|
| 669 | tests from this class, false if you don't, and None if you don't |
|---|
| 670 | care. |
|---|
| 671 | |
|---|
| 672 | :param cls: The class being examined by the selector |
|---|
| 673 | """ |
|---|
| 674 | pass |
|---|
| 675 | |
|---|
| 676 | def wantDirectory(self, dirname): |
|---|
| 677 | """Return true if you want test collection to descend into this |
|---|
| 678 | directory, false if you do not, and None if you don't care. |
|---|
| 679 | |
|---|
| 680 | :param dirname: Full path to directory being examined by the selector |
|---|
| 681 | """ |
|---|
| 682 | pass |
|---|
| 683 | |
|---|
| 684 | def wantFile(self, file): |
|---|
| 685 | """Return true if you want to collect tests from this file, |
|---|
| 686 | false if you do not and None if you don't care. |
|---|
| 687 | |
|---|
| 688 | Change from 0.9: The optional package parameter is no longer passed. |
|---|
| 689 | |
|---|
| 690 | :param file: Full path to file being examined by the selector |
|---|
| 691 | """ |
|---|
| 692 | pass |
|---|
| 693 | |
|---|
| 694 | def wantFunction(self, function): |
|---|
| 695 | """Return true to collect this function as a test, false to |
|---|
| 696 | prevent it from being collected, and None if you don't care. |
|---|
| 697 | |
|---|
| 698 | :param function: The function object being examined by the selector |
|---|
| 699 | """ |
|---|
| 700 | pass |
|---|
| 701 | |
|---|
| 702 | def wantMethod(self, method): |
|---|
| 703 | """Return true to collect this method as a test, false to |
|---|
| 704 | prevent it from being collected, and None if you don't care. |
|---|
| 705 | |
|---|
| 706 | :param method: The method object being examined by the selector |
|---|
| 707 | :type method: unbound method |
|---|
| 708 | """ |
|---|
| 709 | pass |
|---|
| 710 | |
|---|
| 711 | def wantModule(self, module): |
|---|
| 712 | """Return true if you want to collection to descend into this |
|---|
| 713 | module, false to prevent the collector from descending into the |
|---|
| 714 | module, and None if you don't care. |
|---|
| 715 | |
|---|
| 716 | :param module: The module object being examined by the selector |
|---|
| 717 | :type module: python module |
|---|
| 718 | """ |
|---|
| 719 | pass |
|---|
| 720 | |
|---|
| 721 | def wantModuleTests(self, module): |
|---|
| 722 | """ |
|---|
| 723 | .. warning:: DEPRECATED -- this method will not be called, it has |
|---|
| 724 | been folded into wantModule. |
|---|
| 725 | """ |
|---|
| 726 | pass |
|---|
| 727 | wantModuleTests.deprecated = True |
|---|
| 728 | |
|---|