File: formatter.steps_usage.feature

package info (click to toggle)
behave 1.2.6-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,160 kB
  • sloc: python: 19,857; makefile: 137; sh: 18
file content (404 lines) | stat: -rw-r--r-- 18,863 bytes parent folder | download | duplicates (3)
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
@sequential
Feature: Steps Usage Formatter

    As a test writer
    I want to get an overview which step definitions are used and where
    To simplify the refactoring of step definitions (and features).

    . SOLUTION: Use StepsUsageFormatter in dry-run mode, like:
    .
    .       behave --dry-run -f steps.usage features/
    .
    . NOTE: This formatter corresponds to the "usage" formatter in cucumber.


    @setup
    Scenario: Feature Setup
        Given a new working directory
        And a file named "features/steps/passing_steps.py" with:
            """
            from behave import step

            @step('{word:w} step passes')
            def step_passes(context, word):
                pass

            @step('{word:w} step fails')
            def step_passes(context, word):
                assert False, "XFAIL-STEP"
            """
        And a file named "features/steps/unused_steps.py" with:
            """
            from behave import step

            @step('an unused step')
            def step_unused(context):
                pass

            @step('another unused step')
            def step_another_unused(context):
                pass
            """
        And a file named "features/steps/alice_steps.py" with:
            """
            from behave import given, when, then

            @given('{person} lives in {city}')
            def step_given_person_lives_in_city(context, person, city):
                pass

            @when('I visit {person}')
            def step_when_visit_person(context, person):
                pass

            @then('I meet {person} in {city}')
            def step_then_meet_person_in_city(context, person, city):
                pass
            """
        And a file named "features/steps/charly_steps.py" with:
            """
            from behave import given, when, then

            @given('{person} works for {company}')
            def step_given_person_works_for_company(context, person, company):
                pass

            @when('I plan a meeting with {person}')
            def step_when_plan_meeting_with_person(context, person):
                pass

            @then('I meet him at the {company} office')
            def step_then_meet_him_at_company_office(context, company):
                pass
            """
        And a file named "features/alice.feature" with:
            """
            Feature:
              Scenario: Visit Alice
                Given Alice lives in Paris
                When I visit Alice
                Then I meet Alice in Paris

              Scenario: Visit Bob
                Given Bob lives in Berlin
                When I visit Bob
                Then I meet Bob in Berlin
            """
        And a file named "features/bob.feature" with:
            """
            Feature:
              Scenario: Visit Bob
                Given Bob lives in Barcelona
                When I visit Bob
                Then I meet Bob in Barcelona
                And a step passes
            """
        And a file named "features/charly.feature" with:
            """
            Feature:
              Scenario: Meeting with Charly
                Given Charly works for ACME
                When I plan a meeting with Charly
                Then I meet him at the ACME office
            """


    @usecase.primary
    Scenario: Show step definitions usage with all features in dry-run mode
        When I run "behave --dry-run -f steps.usage features/"
        Then it should pass with:
          """
          @given('{person} lives in {city}')        # features/steps/alice_steps.py:3
            Given Alice lives in Paris              # features/alice.feature:3
            Given Bob lives in Berlin               # features/alice.feature:8
            Given Bob lives in Barcelona            # features/bob.feature:3

          @when('I visit {person}')                 # features/steps/alice_steps.py:7
            When I visit Alice                      # features/alice.feature:4
            When I visit Bob                        # features/alice.feature:9
            When I visit Bob                        # features/bob.feature:4

          @then('I meet {person} in {city}')        # features/steps/alice_steps.py:11
            Then I meet Alice in Paris              # features/alice.feature:5
            Then I meet Bob in Berlin               # features/alice.feature:10
            Then I meet Bob in Barcelona            # features/bob.feature:5

          @given('{person} works for {company}')    # features/steps/charly_steps.py:3
            Given Charly works for ACME             # features/charly.feature:3

          @when('I plan a meeting with {person}')   # features/steps/charly_steps.py:7
            When I plan a meeting with Charly       # features/charly.feature:4

          @then('I meet him at the {company} office')  # features/steps/charly_steps.py:11
            Then I meet him at the ACME office         # features/charly.feature:5

          @step('{word:w} step passes')             # features/steps/passing_steps.py:3
            And a step passes                       # features/bob.feature:6

          UNUSED STEP DEFINITIONS[3]:
            @step('{word:w} step fails')            # features/steps/passing_steps.py:7
            @step('an unused step')                 # features/steps/unused_steps.py:3
            @step('another unused step')            # features/steps/unused_steps.py:7
          """
        And note that "the UNUSED STEP DEFINITIONS are ordered by file location"
        But note that "step definitions from unused_steps.py are not used by any feature"


    @usecase.primary
    Scenario: Show step definitions usage with one feature (dry-run mode)
        When I run "behave --dry-run -f steps.usage features/alice.feature"
        Then it should pass with:
          """
          @given('{person} lives in {city}')        # features/steps/alice_steps.py:3
            Given Alice lives in Paris              # features/alice.feature:3
            Given Bob lives in Berlin               # features/alice.feature:8

          @when('I visit {person}')                 # features/steps/alice_steps.py:7
            When I visit Alice                      # features/alice.feature:4
            When I visit Bob                        # features/alice.feature:9

          @then('I meet {person} in {city}')        # features/steps/alice_steps.py:11
            Then I meet Alice in Paris              # features/alice.feature:5
            Then I meet Bob in Berlin               # features/alice.feature:10

          UNUSED STEP DEFINITIONS[7]:
            @given('{person} works for {company}')       # features/steps/charly_steps.py:3
            @when('I plan a meeting with {person}')      # features/steps/charly_steps.py:7
            @then('I meet him at the {company} office')  # features/steps/charly_steps.py:11
            @step('{word:w} step passes')                # features/steps/passing_steps.py:3
            @step('{word:w} step fails')                 # features/steps/passing_steps.py:7
            @step('an unused step')                      # features/steps/unused_steps.py:3
            @step('another unused step')                 # features/steps/unused_steps.py:7
          """
        But note that "step definitions from charly_steps.py, passing_steps.py are now no longer used"


    @usecase.primary
    Scenario: Show step definitions usage with two features (dry-run mode)
        When I run "behave --dry-run -f steps.usage features/alice.feature features/charly.feature"
        Then it should pass with:
          """
          @given('{person} lives in {city}')        # features/steps/alice_steps.py:3
            Given Alice lives in Paris              # features/alice.feature:3
            Given Bob lives in Berlin               # features/alice.feature:8

          @when('I visit {person}')                 # features/steps/alice_steps.py:7
            When I visit Alice                      # features/alice.feature:4
            When I visit Bob                        # features/alice.feature:9

          @then('I meet {person} in {city}')        # features/steps/alice_steps.py:11
            Then I meet Alice in Paris              # features/alice.feature:5
            Then I meet Bob in Berlin               # features/alice.feature:10

          @given('{person} works for {company}')    # features/steps/charly_steps.py:3
            Given Charly works for ACME             # features/charly.feature:3

          @when('I plan a meeting with {person}')   # features/steps/charly_steps.py:7
            When I plan a meeting with Charly       # features/charly.feature:4

          @then('I meet him at the {company} office')  # features/steps/charly_steps.py:11
            Then I meet him at the ACME office         # features/charly.feature:5

          UNUSED STEP DEFINITIONS[4]:
            @step('{word:w} step passes')           # features/steps/passing_steps.py:3
            @step('{word:w} step fails')            # features/steps/passing_steps.py:7
            @step('an unused step')                 # features/steps/unused_steps.py:3
            @step('another unused step')            # features/steps/unused_steps.py:7
          """
        But note that "step definitions from passing_steps.py, unused_steps.py are not used by any feature"


    @usecase.secondary
    Scenario: Show step definitions usage with all features in normal mode
        When I run "behave -f steps.usage features/"
        Then it should pass with:
          """
          @given('{person} lives in {city}')        # features/steps/alice_steps.py:3
            Given Alice lives in Paris              # features/alice.feature:3
            Given Bob lives in Berlin               # features/alice.feature:8
            Given Bob lives in Barcelona            # features/bob.feature:3

          @when('I visit {person}')                 # features/steps/alice_steps.py:7
            When I visit Alice                      # features/alice.feature:4
            When I visit Bob                        # features/alice.feature:9
            When I visit Bob                        # features/bob.feature:4

          @then('I meet {person} in {city}')        # features/steps/alice_steps.py:11
            Then I meet Alice in Paris              # features/alice.feature:5
            Then I meet Bob in Berlin               # features/alice.feature:10
            Then I meet Bob in Barcelona            # features/bob.feature:5

          @given('{person} works for {company}')    # features/steps/charly_steps.py:3
            Given Charly works for ACME             # features/charly.feature:3

          @when('I plan a meeting with {person}')   # features/steps/charly_steps.py:7
            When I plan a meeting with Charly       # features/charly.feature:4

          @then('I meet him at the {company} office')  # features/steps/charly_steps.py:11
            Then I meet him at the ACME office         # features/charly.feature:5

          @step('{word:w} step passes')             # features/steps/passing_steps.py:3
            And a step passes                       # features/bob.feature:6

          UNUSED STEP DEFINITIONS[3]:
            @step('{word:w} step fails')            # features/steps/passing_steps.py:7
            @step('an unused step')                 # features/steps/unused_steps.py:3
            @step('another unused step')            # features/steps/unused_steps.py:7
          """

    @corner.case
    Scenario: StepsUsageFormatter shows undefined steps
        Given a file named "features/undefined.feature" with:
          """
          Feature: With undefined steps
            Scenario:
              Given a step is undefined
              Then another step is undefined
          """
        When I run "behave --dry-run -f steps.usage features/alice.feature features/undefined.feature"
        Then it should fail with:
          """
          0 features passed, 0 failed, 0 skipped, 2 untested
          0 scenarios passed, 0 failed, 0 skipped, 3 untested
          0 steps passed, 0 failed, 0 skipped, 2 undefined, 6 untested
          """
        And the command output should contain:
          """
          @given('{person} lives in {city}')        # features/steps/alice_steps.py:3
            Given Alice lives in Paris              # features/alice.feature:3
            Given Bob lives in Berlin               # features/alice.feature:8

          @when('I visit {person}')                 # features/steps/alice_steps.py:7
            When I visit Alice                      # features/alice.feature:4
            When I visit Bob                        # features/alice.feature:9

          @then('I meet {person} in {city}')        # features/steps/alice_steps.py:11
            Then I meet Alice in Paris              # features/alice.feature:5
            Then I meet Bob in Berlin               # features/alice.feature:10

          UNUSED STEP DEFINITIONS[7]:
            @given('{person} works for {company}')       # features/steps/charly_steps.py:3
            @when('I plan a meeting with {person}')      # features/steps/charly_steps.py:7
            @then('I meet him at the {company} office')  # features/steps/charly_steps.py:11
            @step('{word:w} step passes')                # features/steps/passing_steps.py:3
            @step('{word:w} step fails')                 # features/steps/passing_steps.py:7
            @step('an unused step')                      # features/steps/unused_steps.py:3
            @step('another unused step')                 # features/steps/unused_steps.py:7

          UNDEFINED STEPS[2]:
            Given a step is undefined               # features/undefined.feature:3
            Then another step is undefined          # features/undefined.feature:4
          """


    @corner.case
    Scenario: StepsUsageFormatter shows all locations of undefined step usage

        Ensure that all location are shown where an undefined step is used

        Given a file named "features/undefined_duplicates.feature" with:
          """
          Feature: With undefined steps

            Scenario: Same undefined step used twice
              Given a step is undefined
              And a step is undefined
              Then a step passes

            Scenario: Same undefined step used again
              Given a step passes
              And a step is undefined
          """
        When I run "behave --dry-run -f steps.usage features/undefined_duplicates.feature"
        Then it should fail with:
          """
          0 scenarios passed, 0 failed, 0 skipped, 2 untested
          0 steps passed, 0 failed, 0 skipped, 3 undefined, 2 untested
          """
        And the command output should contain:
          """
          UNDEFINED STEPS[3]:
            Given a step is undefined               # features/undefined_duplicates.feature:4
            And a step is undefined                 # features/undefined_duplicates.feature:5
            And a step is undefined                 # features/undefined_duplicates.feature:10
          """

    @use_outline
    Scenario: Scenario Outlines should not cause duplicated step entries

      Scenario Outlines generate Scenarios that use the same step multiple times.
      This duplication should not be listed.

        Given a file named "features/use_scenario_outline.feature" with:
          """
          Feature:
            Scenario Outline:
              Given a step <outcome1>
              When another step <outcome2>

            Examples:
              | outcome1 | outcome2 |
              |  passes  | passes   |
              |  passes  | fails    |
          """
        When I run "behave --dry-run -f steps.usage features/use_scenario_outline.feature"
        Then it should pass with:
          """
          0 scenarios passed, 0 failed, 0 skipped, 2 untested
          0 steps passed, 0 failed, 0 skipped, 0 undefined, 4 untested
          """
        And the command output should contain:
          """
          @step('{word:w} step passes')             # features/steps/passing_steps.py:3
            Given a step passes                     # features/use_scenario_outline.feature:3
            When another step passes                # features/use_scenario_outline.feature:4

          @step('{word:w} step fails')              # features/steps/passing_steps.py:7
            When another step fails                 # features/use_scenario_outline.feature:4
          """
        But the command output should not contain:
          """
          @step('{word:w} step passes')             # features/steps/passing_steps.py:3
            Given a step passes                     # features/use_scenario_outline.feature:3
            When another step passes                # features/use_scenario_outline.feature:4
            Given a step passes                     # features/use_scenario_outline.feature:3
          """

    @use_outline
    Scenario: Scenario Outlines should not cause duplicated entries for undefined steps

      Scenario Outlines generate Scenarios that use the same step multiple times.
      This duplication should not be listed.

        Given a file named "features/scenario_outline_with_undefined.feature" with:
          """
          Feature:
            Scenario Outline:
              Given a step is <status1>
              When another step is <status2>

            Examples:
              | status1   | status2   |
              | undefined | undefined |
              | undefined | undefined |
          """
        When I run "behave --dry-run -f steps.usage features/scenario_outline_with_undefined.feature"
        Then it should fail with:
          """
          0 scenarios passed, 0 failed, 0 skipped, 2 untested
          0 steps passed, 0 failed, 0 skipped, 4 undefined
           """
        And the command output should contain:
          """
          UNDEFINED STEPS[2]:
            Given a step is undefined               # features/scenario_outline_with_undefined.feature:3
            When another step is undefined          # features/scenario_outline_with_undefined.feature:4
          """
        But the command output should not contain:
          """
          UNDEFINED STEPS[2]:
            Given a step is undefined               # features/scenario_outline_with_undefined.feature:3
            Given a step is undefined               # features/scenario_outline_with_undefined.feature:3
            When another step is undefined          # features/scenario_outline_with_undefined.feature:4
            When another step is undefined          # features/scenario_outline_with_undefined.feature:4
          """