fitnesseacceptance-testing

FitNesse: Variable assignment and simple arithmetic


According to the user guide it is possible to assign values to variables and then perform simple arithmetic.

Imagine I have fixture designed to take an element on the page and extracting the numerical value as a Double (i do this now using the HSAC Slim BrowserTest fixture and my own code)

|script    |numbers extraction                         |
|$testval1=|numeric value of  |element1              | |
|$testval2=|numeric value of  |element2              | |

Running this gives me something like:

|script            |numbers extraction                         |
|$testval1<-[20.04]|numeric value of  |element1 ->[€ 20,04]  | |
|$testval2<-[5.1]  |numeric value of  |element2 ->[€ 5,1]    | |

Now say I want to compare the sum of the two doubles with the numeric value of a third element:

|script|numbers extraction                                           |
|check |numeric value of  |element3|{=${ ${testval1} + ${testval2} =}|

No matter what combination of parentheses and dollar-signs I use in the last cell, I always get 'invalid expression'.

Running the last line (without parenthesis around testval1 and testval2) returns:

|check|numeric value of|element3  ->[€ 25.14]| [25.14] expected [invalid expression: $testval1->[20.04] + $testval2->[5.1]] |

Solution

  • Unfortunately you can can't do what you are looking for. The variables you assign the value of the elements to are actually SLIM symbols, and not variables at the wiki level. If you scroll a bit down on the user guide page you linked to in the question you will find a section called "Difference between variables and SLIM symbols":

    • Variables are evaluated at render time, before the test executes. This allows for values to be set based on page hierarchy and other things that are purely inputs to the tests.
    • Symbols only exist at execution time. They can be changed at runtime, so are distinct from variables, which cannot.

    I find the three types of variables in FitNesse/SLIM are confusing to people and their different usage, syntax and possibilities cause many issues. My understanding is:

    1. Markup variables (aka wiki variables). For instance ${myVar}, defined using !define. They get their value at page render time, so even before a test is started, so you see their value when you browse to a wiki page, and only in the page's source do you see it is a variable. These can be used in markup expressions, which is what you are trying to do in the question.
    2. Scenario parameters. For instance @{myVar} (or @myVar), defined in the first row of a SLIM scenario table. These are the 'formal parameters' to the scenario, which get their actual value based on the invocation of the scenario (i.e. each usage of the scenario, either from a script table, other scenario or row in a decision table defines their value). They get their value at the start of a test, before its first action is performed. You see the variable when you look at the scenario table that defines it. (When you use the 'table template' table type defined by hsac-fitnesse-plugin (which is included in hsac-fitnesse-fixtures project baseline) you don't need to define the variable names in the first row of the table, they are automatically found based on their occurrence (e.g. @{myVar}) inside the table.)
    3. SLIM symbols. For instance $myVar, they are assigned their value using $myVar=. These are 'runtime variables' that get their value during test execution, they are global to a test suite and their value might be changed during test execution. These are the only kind of variables that can get their value from a property obtained from the 'system under test', and they are the variables you are using in your question's tables. They are actually references to objects inside the SLIM process so fixtures might change the internal state of the object the variable refers to, without this change showing in the wiki representation of the variable (which is just the object's toString() result at time of last assignment).

    P.S. The conversion of a string to a double does not require a custom fixture (like your numbers extraction) when you using the hsac-fitnesse-fixtures. You could just use the convert to double method of the library's string fixture.