| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 1 | # coding=utf-8 |
| 2 | """ |
| 3 | BDD lettuce framework runner |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 4 | TODO: Support other params (like tags) as well. |
| 5 | Supports only 1 param now: folder to search "features" for. |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 6 | """ |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 7 | import _bdd_utils |
| 8 | |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 9 | __author__ = 'Ilya.Kazakevich' |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 10 | from lettuce.exceptions import ReasonToFail |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 11 | import sys |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 12 | import lettuce |
| 13 | from lettuce import core |
| 14 | |
| 15 | |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 16 | class _LettuceRunner(_bdd_utils.BddRunner): |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 17 | """ |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 18 | Lettuce runner (BddRunner for lettuce) |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 19 | """ |
| 20 | |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 21 | def __init__(self, base_dir, what_to_run): |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 22 | """ |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 23 | |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 24 | :param base_dir base directory to run tests in |
| 25 | :type base_dir: str |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 26 | :param what_to_run folder or file to run |
| 27 | :type what_to_run str |
| 28 | """ |
| 29 | super(_LettuceRunner, self).__init__(base_dir) |
| 30 | self.__runner = lettuce.Runner(what_to_run) |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 31 | |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 32 | def _get_features_to_run(self): |
| 33 | super(_LettuceRunner, self)._get_features_to_run() |
| 34 | if self.__runner.single_feature: # We need to run one and only one feature |
| 35 | return [core.Feature.from_file(self.__runner.single_feature)] |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 36 | |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 37 | # Find all features in dir |
| 38 | features = [] |
| 39 | for feature_file in self.__runner.loader.find_feature_files(): |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 40 | feature = core.Feature.from_file(feature_file) |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 41 | assert isinstance(feature, core.Feature), feature |
| 42 | # TODO: cut out due to https://github.com/gabrielfalcao/lettuce/issues/451 Fix when this issue fixed |
| 43 | feature.scenarios = filter(lambda s: not s.outlines, feature.scenarios) |
| 44 | if feature.scenarios: |
| 45 | features.append(feature) |
| 46 | return features |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 47 | |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 48 | def _run_tests(self): |
| 49 | super(_LettuceRunner, self)._run_tests() |
| 50 | self.__install_hooks() |
| 51 | self.__runner.run() |
| 52 | |
| 53 | def __step(self, is_started, step): |
| 54 | """ |
| 55 | Reports step start / stop |
| 56 | :type step core.Step |
| 57 | :param step: step |
| 58 | """ |
| 59 | test_name = step.sentence |
| 60 | if is_started: |
| 61 | self._test_started(test_name, step.described_at) |
| 62 | elif step.passed: |
| 63 | self._test_passed(test_name) |
| 64 | elif step.failed: |
| 65 | reason = step.why |
| 66 | assert isinstance(reason, ReasonToFail), reason |
| 67 | self._test_failed(test_name, message=reason.exception, details=reason.traceback) |
| 68 | elif step.has_definition: |
| 69 | self._test_skipped(test_name, "In lettuce, we do know the reason", step.described_at) |
| 70 | else: |
| 71 | self._test_undefined(test_name, step.described_at) |
| 72 | |
| 73 | def __install_hooks(self): |
| 74 | """ |
| 75 | Installs required hooks |
| 76 | """ |
| 77 | |
| 78 | # Install hooks |
| 79 | lettuce.before.each_feature( |
| 80 | lambda f: self._feature_or_scenario(True, f.name, f.described_at)) |
| 81 | lettuce.after.each_feature( |
| 82 | lambda f: self._feature_or_scenario(False, f.name, f.described_at)) |
| 83 | |
| 84 | lettuce.before.each_scenario( |
| 85 | lambda s: self.__scenario(True, s)) |
| 86 | lettuce.after.each_scenario( |
| 87 | lambda s: self.__scenario(False, s)) |
| 88 | |
| 89 | lettuce.before.each_background( |
| 90 | lambda b, *args: self._background(True, b.feature.described_at)) |
| 91 | lettuce.after.each_background( |
| 92 | lambda b, *args: self._background(False, b.feature.described_at)) |
| 93 | |
| 94 | lettuce.before.each_step(lambda s: self.__step(True, s)) |
| 95 | lettuce.after.each_step(lambda s: self.__step(False, s)) |
| 96 | |
| 97 | def __scenario(self, is_started, scenario): |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 98 | """ |
| 99 | Reports scenario launched |
| 100 | :type scenario core.Scenario |
| 101 | :param scenario: scenario |
| 102 | """ |
| 103 | if scenario.outlines: |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 104 | scenario.steps = [] # Clear to prevent running. TODO: Fix when this issue fixed |
| 105 | scenario.background = None # TODO: undocumented |
| 106 | return |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 107 | self._feature_or_scenario(is_started, scenario.name, scenario.described_at) |
| Tor Norbye | 2e5965e | 2014-07-25 12:24:15 -0700 | [diff] [blame] | 108 | |
| 109 | |
| 110 | if __name__ == "__main__": |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 111 | (base_dir, what_to_run) = _bdd_utils.get_path_by_args(sys.argv) |
| Tor Norbye | c3d3a90 | 2014-09-04 13:24:04 -0700 | [diff] [blame^] | 112 | _bdd_utils.fix_win_drive(what_to_run) |
| Tor Norbye | 02cf98d | 2014-08-19 12:53:10 -0700 | [diff] [blame] | 113 | _LettuceRunner(base_dir, what_to_run).run() |