Equivalence partition example

Consider a human-resource system that decides how we should process employment applications based on a person’s age.

Age range Decision
0 - 16 Do not hire.
16 - 18 Can hire on a part-time basis only.
18 - 55 Can hire as a full-time employee
55 - 99

How the test cases for the above example should be designed? We could test the module for the following ages: 0, 1, 2, 3, 4, 5, 6, 7, 8, ..., 90, 91, 92, 93, 94, 95, 96, 97, 98, 99? Sure! But we could just one element from each range. Actually, each range is a equivalence class, so any one within that range is just as good as any other one. Indeed, considering the following implementation, this assumption is valid:

<source lang="java"> if (applicantAge >= 0 && applicantAge <= 16) hireStatus = "NO"; if (applicantAge >= 16 && applicantAge <= 18) hireStatus = "PART"; if (applicantAge >= 18 && applicantAge <= 55) hireStatus = "FULL"; if (applicantAge >= 55 && applicantAge <= 99) hireStatus = "NO"; </source>

Using the equivalence partition criterion, we have reduced the number of test cases from 100 (testing each age) to four (testing one age in each equivalence class) – a significant savings (96%).

However, what if the module implementation is:

<source lang="java"> if (applicantAge == 0) hireStatus = "NO"; if (applicantAge == 1) hireStatus = "NO"; ... if (applicantAge == 15) hireStatus = "NO"; if (applicantAge == 16) hireStatus = "PART"; if (applicantAge == 17) hireStatus = "PART"; if (applicantAge == 18) hireStatus = "FULL"; if (applicantAge == 19) hireStatus = "FULL"; ... if (applicantAge == 53) hireStatus = "FULL"; if (applicantAge == 54) hireStatus = "FULL"; if (applicantAge == 55) hireStatus = "NO"; if (applicantAge == 56) hireStatus = "NO"; ... if (applicantAge == 98) hireStatus = "NO"; if (applicantAge == 99) hireStatus = "NO"; </source>

Given this implementation, the fact that any set of tests passes tells us nothing about the next test we could execute. It may pass; it may fail. Thus, the equivalence partition testing assumption does not apply.

Another possibility is the non-conformity of the implementation to the specification:

<source lang="java"> if (applicantAge >= 0 && applicantAge <= 16)

  hireStatus = "NO";

if (applicantAge >= 16 && applicantAge <= 18)

  hireStatus = "PART";

if (applicantAge >= 18 && applicantAge <= 41)

  hireStatus = "FULL";

// strange statements follow if (applicantAge == 42 && applicantName == "Lee")

  hireStatus="HIRE NOW AT HUGE SALARY";

if (applicantAge == 42 && applicantName <> "Lee")

  hireStatus="FULL";

// end of strange statements if (applicantAge >= 55 && applicantAge <= 99)

  hireStatus = "NO";

</source>


References

  • <bib>vincenzi-maldonado:2007</bib>
  • <bib>copeland:2004</bib>