# Integration Testing - Units of measure

A SW-Component "SWC-A" is integrated with a SW-Component "SWC-B". The SWC-A has an output interface which provides "Distance in meters". The SWC-B receives this value and does some calculation. If in SWC-B interprets the received value is interpreted as "Distance in Feet" and not in meters. How can this scenario be tested (static/dynamic), where Units of measure between two components are different.

• Can you give some more information about how these two components interact? Is one component passed as a constructor argument to another? A function argument maybe? Is the result of A being passed to B via an object that coordinates A and B? – Greg Burghardt Mar 5 '19 at 12:19
• There is no way, in general, to test this error. – BobDalgleish Mar 5 '19 at 14:38

If the calculation is deterministic, the values of correct (in meters) and incorrect (in feet) results are known to you in advance for any specific input. Choose an input to A and write tests for the output of B based upon the possible output values. One test to tell if the result is correct, and another to test for the specific case where the result is wrong because B assumed feet instead of meters.

• Can you provide an example? I can't think of a way to tell whether the value `2` is in feet or in meters. – BobDalgleish Mar 5 '19 at 14:43
• @BobDalgleish You know what your method is supposed to do, so you know what the answer should be. E.g., you want to calculate how long it takes to fall a distance `x`. If x is 5 meters, the answer should be ~1 second, whereas if it was 5 feet, the answer should be ~0.5 second. If you input `5` to SWC-A, the answer should be `1`. If you input `5` to SWC-B, the answer should be `0.5`. – mmathis Mar 5 '19 at 15:36
• You have two independent parameters for your proposed test, which you can test against. On the other hand if SWC-B calculates the area, then no test is possible. – BobDalgleish Mar 5 '19 at 18:28
• @BobDalgleish In the case of area, units don't matter. The question implicitly suggests units matter. – Joe Mar 5 '19 at 20:14
• @Joe well, units do matter very much with area - 5 m^2 is quite a larger area than 5 ft^2. The problem here is that it is impossible to differentiate the two cases, without some additional work. – mmathis Mar 6 '19 at 0:24

If you have the ability to change the codebase(s), you can add the notion of a measurement unit to your methods, either as a separate class or as an additional (string) parameter. I've worked with products / APIs that had a fully-fleshed out unit and coordinate system, defining unit, unit measurement, symbols, as well as a complete conversion utility. That may be overkill for your application, but even a smaller subset of those classes would very clearly define the units being used in your methods / classes. This would then lend itself to testing using feet and meters in both methods / components.

A `Measurement` class may be as simple as a value and a unit symbol (m), or include the unit string (meters), or an entire class for the unit. Depends on how flexible you need it to be.

A word of wisdom from experience in dealing with various unit systems: your API should always use a single unit system - whether it be SI, Imperial, or some hodge-podge of units common to your domain (in oil & gas, for instance, it is common to work with times in milliseconds, so using the SI standard of seconds would be a bit unwieldy). The expected units should also be clearly defined in your documentation, so there is never any confusion as to what units need to be passed in.