blob: f0a4b5dbb873fe9d38565eb3d82f0b34adb3a8b0 [file] [log] [blame]
Tor Norbye2e5965e2014-07-25 12:24:15 -07001# coding=utf-8
2"""
3BDD lettuce framework runner
Tor Norbye02cf98d2014-08-19 12:53:10 -07004TODO: Support other params (like tags) as well.
5Supports only 1 param now: folder to search "features" for.
Tor Norbye2e5965e2014-07-25 12:24:15 -07006"""
Tor Norbye02cf98d2014-08-19 12:53:10 -07007import _bdd_utils
8
Tor Norbye2e5965e2014-07-25 12:24:15 -07009__author__ = 'Ilya.Kazakevich'
Tor Norbye2e5965e2014-07-25 12:24:15 -070010from lettuce.exceptions import ReasonToFail
Tor Norbye2e5965e2014-07-25 12:24:15 -070011import sys
Tor Norbye2e5965e2014-07-25 12:24:15 -070012import lettuce
13from lettuce import core
14
15
Tor Norbye02cf98d2014-08-19 12:53:10 -070016class _LettuceRunner(_bdd_utils.BddRunner):
Tor Norbye2e5965e2014-07-25 12:24:15 -070017 """
Tor Norbye02cf98d2014-08-19 12:53:10 -070018 Lettuce runner (BddRunner for lettuce)
Tor Norbye2e5965e2014-07-25 12:24:15 -070019 """
20
Tor Norbye02cf98d2014-08-19 12:53:10 -070021 def __init__(self, base_dir, what_to_run):
Tor Norbye2e5965e2014-07-25 12:24:15 -070022 """
Tor Norbye02cf98d2014-08-19 12:53:10 -070023
Tor Norbye2e5965e2014-07-25 12:24:15 -070024 :param base_dir base directory to run tests in
25 :type base_dir: str
Tor Norbye02cf98d2014-08-19 12:53:10 -070026 :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 Norbye2e5965e2014-07-25 12:24:15 -070031
Tor Norbye02cf98d2014-08-19 12:53:10 -070032 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 Norbye2e5965e2014-07-25 12:24:15 -070036
Tor Norbye02cf98d2014-08-19 12:53:10 -070037 # Find all features in dir
38 features = []
39 for feature_file in self.__runner.loader.find_feature_files():
Tor Norbye2e5965e2014-07-25 12:24:15 -070040 feature = core.Feature.from_file(feature_file)
Tor Norbye02cf98d2014-08-19 12:53:10 -070041 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 Norbye2e5965e2014-07-25 12:24:15 -070047
Tor Norbye02cf98d2014-08-19 12:53:10 -070048 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 Norbye2e5965e2014-07-25 12:24:15 -070098 """
99 Reports scenario launched
100 :type scenario core.Scenario
101 :param scenario: scenario
102 """
103 if scenario.outlines:
Tor Norbye2e5965e2014-07-25 12:24:15 -0700104 scenario.steps = [] # Clear to prevent running. TODO: Fix when this issue fixed
105 scenario.background = None # TODO: undocumented
106 return
Tor Norbye02cf98d2014-08-19 12:53:10 -0700107 self._feature_or_scenario(is_started, scenario.name, scenario.described_at)
Tor Norbye2e5965e2014-07-25 12:24:15 -0700108
109
110if __name__ == "__main__":
Tor Norbye02cf98d2014-08-19 12:53:10 -0700111 (base_dir, what_to_run) = _bdd_utils.get_path_by_args(sys.argv)
Tor Norbyec3d3a902014-09-04 13:24:04 -0700112 _bdd_utils.fix_win_drive(what_to_run)
Tor Norbye02cf98d2014-08-19 12:53:10 -0700113 _LettuceRunner(base_dir, what_to_run).run()