Concordion > Commands > verifyRows > Strategies >

KeyMatch verification strategy

Since Concordion 2.0.0

The KeyMatch strategy can be applied to the verify rows command to find a matching row, prior to verifying the contents of the row. The match is performed against a subset of the table columns, defined by marking those columns as key fields.

The strategy is applied by adding the concordion:matchStrategy="KeyMatch" attribute to the verify rows command.

Please note that the commands on the table header are being evaluated on a copy of the rows multiple times. This means the commands have to be idempotent and lightweight.

The strategy is:

The key match algorithm is:

Examples

Each of the following scenarios uses the command:

<table concordion:verifyRows="#user : users" concordion:matchStrategy="KeyMatch">
<tr>
   <th concordion:assertEquals="#user.firstName" concordion:matchingRole="key">First Name</th>
   <th concordion:assertEquals="#user.lastName" concordion:matchingRole="key">Last Name</th>
   <th concordion:assertEquals="#user.age">Age</th>
</tr>
   [ROWS]
</table>

with [ROWS] replaced by the Expected [ROWS] and Result [ROWS].

Scenario Expected [ROWS] Expected Table Actual Result [ROWS] Result Table
All match in same order
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{John,Smith,17};
{Jane,Dou,22}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="success">22</td>
 </tr>
                
All match in different order
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{Jane,Dou,22};
{John,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="success">22</td>
 </tr>
                
All match in different order with duplicates
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{Jane,Dou,22};
{John,Smith,17};
{Jane,Dou,22}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="success">22</td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="success">22</td>
 </tr>
                
One row missing
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{John,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
 <tr class="missing">
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
One surplus row
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{Jane,Dou,22};
{John,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
 <tr class="surplus"><td class="failure"><del class="expected"> </del>
    <ins class="actual">Jane</ins></td><td class="failure"><del class="expected"> </del>
    <ins class="actual">Dou</ins></td><td class="failure"><del class="expected"> </del>
    <ins class="actual">22</ins></td></tr>
                
One of the duplicated rows missing
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{John,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
 <tr class="missing">
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
One surplus duplicate
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{John,Smith,17};
{John,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="success">17</td>
 </tr>
<tr class="surplus"><td class="failure"><del class="expected"> </del>
<ins class="actual">John</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">Smith</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">17</ins></td></tr>
                
One non key field is incorrect
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{John,Smith,22}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="failure"><del class="expected">17</del>
<ins class="actual">22</ins></td>
 </tr>
                
One key field is incorrect
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{Jane,Smith,17}
 <tr class="missing">
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
<tr class="surplus"><td class="failure"><del class="expected"> </del>
<ins class="actual">Jane</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">Smith</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">17</ins></td></tr>
                
Two rows, each with incorrect field
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{John,Smith,22};
{Jane,Dou,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="failure"><del class="expected">17</del>
<ins class="actual">22</ins></td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="failure"><del class="expected">22</del>
<ins class="actual">17</ins></td>
 </tr>
                
Two rows in different order, each with incorrect field
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{Jane,Dou,17};
{John,Smith,22}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="failure"><del class="expected">17</del>
<ins class="actual">22</ins></td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="failure"><del class="expected">22</del>
<ins class="actual">17</ins></td>
 </tr>
                
Two rows, first with incorrect key, second with incorrect value
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td>Jane</td>
    <td>Dou</td>
    <td>22</td>
 </tr>
                
{John,Smither,17};
{Jane,Dou,18}
 <tr class="missing">
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
 <tr>
    <td class="success">Jane</td>
    <td class="success">Dou</td>
    <td class="failure"><del class="expected">22</del>
<ins class="actual">18</ins></td>
 </tr>
<tr class="surplus"><td class="failure"><del class="expected"> </del>
<ins class="actual">John</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">Smither</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">17</ins></td></tr>
                
Duplicated key in actual data
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{John,Smith,23};
{John,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="failure"><del class="expected">17</del>
<ins class="actual">23</ins></td>
 </tr>
<tr class="surplus"><td class="failure"><del class="expected"> </del>
<ins class="actual">John</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">Smith</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">17</ins></td></tr>
                
Expected one row, got two, each with one field different.
Find matching by key.
 <tr>
    <td>John</td>
    <td>Smith</td>
    <td>17</td>
 </tr>
                
{John,Smith,18};
{Jane,Smith,17}
 <tr>
    <td class="success">John</td>
    <td class="success">Smith</td>
    <td class="failure"><del class="expected">17</del>
<ins class="actual">18</ins></td>
 </tr>
<tr class="surplus"><td class="failure"><del class="expected"> </del>
<ins class="actual">Jane</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">Smith</ins></td><td class="failure"><del class="expected"> </del>
<ins class="actual">17</ins></td></tr>