Skip to content

SED-4885 Creating plan samples for RPA - #32

Open
jeromecomte wants to merge 9 commits into
masterfrom
SED-4885-create-samples-for-rpa-plans
Open

SED-4885 Creating plan samples for RPA#32
jeromecomte wants to merge 9 commits into
masterfrom
SED-4885-create-samples-for-rpa-plans

Conversation

@jeromecomte

Copy link
Copy Markdown
Contributor

No description provided.

@david-stephan david-stephan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall good, but took me quite some time to go through it, added several comments. Note, I skipped all keywords and stopped checking the YAML at some points.

Comment thread plans/legacy-exports/README.md Outdated
| `Demo_Google-search.json` | A sequence calling an Echo keyword and asserting on its output |
| `Demo_Data-driven.json` | A data-driven plan iterating over a data source |

Plans built in the Step plan editor are stored serialized as JSON, and these two files are

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how the plan are stored in DB are relevant, I would just say that this is the format used for import/export and not meant for authoring

@jeromecomte jeromecomte Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Totally agree. Will be changed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment thread plans/reference/basic-plan-syntax.yml Outdated
@@ -0,0 +1,67 @@
# A standalone YAML plan: the same tree you would write inside an automation

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The wording is not very clear for me. Not perfect either, but another propostion:

==============================================================================

STANDALONE PLAN

This file represents a single, self-contained Step plan.

Usage:

• Upload directly: Import into the Step UI via "Add plan" > "Create from YAML".

• Convert/add to a package: Move the contents under a plans: list entry inside

an automation package manifest.

This file is a syntax illustration, not a runnable plan - the keywords it

calls do not exist. For plans you can execute, see ../rpa/

==============================================================================

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with your suggestion. Will be changed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment thread plans/reference/dynamic-values.yml Outdated
keyword: "Submit Record"
inputs:
- literalInput: "abc" # static
- numericInput: 777 # static number

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is still a string not sure the comment is correct/clear:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be discussed

Comment thread plans/rpa/README.md Outdated

## What these samples teach

The controls are the vocabulary; these are the ideas that decide whether a plan is any good.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would write "The controls provide the vocabulary; the following principles determine whether a plan is well-designed:"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment thread plans/rpa/README.md
is the reason to use a plan at all instead of one large script.

6. **Values come from outside the plan.** The same bot serves a person on demand
(execution parameters) and a nightly `schedules` entry, with credentials held in

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure it's clear what we means with (execution parameters) a concrete example would help; also not sure that the distinction between on-demand run and scehduled ones belongs to *Values come from outside the plan.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment on lines +137 to +138
It governs whether one failing cleanup step stops the **remaining** cleanup steps — the same
"keep going" semantics as on a sequence, applied to the cleanup list. Without it, a failing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"same "keep going" semantics as on a sequence", I have the feeling we did not mention continueOnError for sequence before, so that's a bit confusing

session.

Put a `sequence` inside the session and use **its** `before` / `after` instead. Those steps
run within the session's token, and `after` still runs when the body fails — so cleanup is

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"token" is probably not required, it just runs outside of the session. I guess all this is (and some other sections of this PR) comes from claude trying something, figuring it out it's not working as expecting and documenting it as such. While this is good as other user will fall in the same traps, I feel the wording around this a bit unnatural.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is exactly the case and I had to perform several iterations to remove such "logs". To be fixed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

| Mechanism | Returns outputs? | Use it when |
|-----------|------------------|-------------|
| **Composite keyword** | Yes, via `return` | The thing you are reusing is a *step* inside someone else's plan. **Reach for this first** |
| `callPlan` | No — it produces its own report branch | The thing you are reusing is a whole bot in its own right, with its own schedule |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't get " own right, with its own schedule"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't get it neither ;) To be fixed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed


## `forEach threads` vs `testSet threads`

- `threads` on a **loop** parallelises **rows** of one bot.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would say "row processing" or something

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed


## A plan that is called is still a plan

`Shared - Archive processed records` exists to be called by plan B, but nothing marks it as

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this might also be confusing for readers. Are seems to be more an artefact of "this is a sample, it should not fail". In real life, if I define such a shared plan, nothing say it has to run standalone too and ahve default values.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree. We should clearly mark this as an requirement for this sample or mark this plan as expected to fail

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

|--------|-----------|----------|----------|-------|
| [rpa-selenium](rpa-selenium/) | selenium | java | keyword-driven | intermediate |

> The sample above is a complete RPA project. For focused examples of the **plan** itself —

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

" of the plan itself" sounds weird, especially singular in this context.

children:

# -------------------------------------------------------------
# THE ITERATION IS THE UNIT THE LOAD NUMBERS ARE COUNTED IN.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand this sentence and honestly not much of the paragraph until the line 65. This sample also only introduce number of users and iterations stated the more complex "knobs" will be in the 2nd sample, but ere we already talk about pacing and throughput.

# assert the response times would look excellent
# and mean nothing.
#
# This runs once per iteration, so a failure at

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find speaking about iteration here is confusing it runs for every Checkout keyword execution. I would also add that all keyword response should be asserted, not just the final one in the workflow.

# THE SLA, EXPRESSED IN THE PLAN.
#
# `performanceAssert` compares an aggregate of a measurement against a
# threshold once the load is over. It turns a load test from "here are

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

once the "test" is over ?

# TWO RULES ABOUT WHERE IT GOES, both easy to get wrong:
#
# 1. A `performanceAssert` MUST live in an `after` or `afterThread`
# block. As an ordinary child - of the thread group, of a testCase,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Writing down the error you will get if you miss place it feels quite redundant.

continueOnError: true
steps:
# "Purchase journey" is created by the keyword with
# startMeasure/stopMeasure, so - unlike an instrumented sequence -

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure it's worth repeating the limitation here

expectedValue: 250

# =========================================================================
# C. Measuring the failures, not just the successes.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the added value compared to the sample 01 ?

virtual user.
2. **`measurementName` must name a keyword or custom measurement**, never an `instrumentNode` one —
that fails with `No measurement is matching the defined filters.`, the same message a misspelled
name gives. For an SLA on a multi-step transaction, emit a custom measurement — see

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I only checked the sample 01 and 05 at the time of writing this, but composite keyword could be used instead

| Instrumented node | the node's `nodeName` | `instrumentNode: true` | **no** — dashboards only |
| Custom | whatever the keyword chooses | `output.startMeasure(...)` in the keyword | **yes** |

Custom measurements are the only way to time something **smaller** than a keyword call (two page

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this paragraph is quite hard to read/understand, custom keyword measurement is to measure part of the keyword execution...
Also written somewhere else "For an SLA on a multi-step transaction, wrap it in a custom measurement" sound wrong, You basically have to create a keyword containing the multi steps first. If it contains only these multisteps you're done, if it contains more than you need a custom measurement to only measure what you need.


### Measure the failures, not just the successes

An average over successful calls only is the most misleading number in load testing — when a system

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence is confusing and I saw the same pattern in the automation package YAML (probably in sample 01 too).
What would be incorrect is to have 1. no functional assertion and 2. rely only on response times without considering failure and success rate.
I see that Performance assert doesn't support rate and doesn't support check on the status at all, but what is formulated here sounds even more confusing than being transparent about it. Using the COUNT in performance assert given that it includes all statuses don't help to automatically assert the test results.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants