[{"data":1,"prerenderedAt":82},["ShallowReactive",2],{"wiki-test-design-equivalence-partitioning-and-boundary-values-en":3},{"meta":4,"html":8,"headings":9,"words":81},{"title":5,"description":6,"published":7,"updated":7},"Equivalence partitioning and boundary values","Splitting input data into equivalence classes and choosing boundary values: two-point and three-point boundaries, examples for numbers, strings and dates.","2026-11-03","\u003Cp>\u003Cstrong>Equivalence partitioning\u003C/strong> (EP) is a black-box test technique that divides the data of a test object into partitions whose elements are expected to be processed in the same way, and derives \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-case\">test cases\u003C/span> so that each partition is exercised at least once. \u003Cstrong>Boundary value analysis\u003C/strong> (BVA) is a black-box test technique that derives test cases from the minimum and maximum values of ordered partitions, where \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"defect\">defects\u003C/span> in comparisons and limits are typically located. The two techniques are used together: partitioning defines the classes, boundary value analysis chooses the values at their edges.\u003C/p>\n\u003Cp>Both techniques are described in The Art of Software Testing by Glenford Myers, first published in 1979; according to a review of that book on AgileConnection, it presented them together with \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"cause-effect-graphing\">cause-effect graphing\u003C/span> and error guessing. Today they are defined in the international standard ISO/IEC/IEEE 29119-4:2021, Software testing, Part 4: Test techniques (clauses 5.2.1 and 5.2.3), and in the ISTQB Certified Tester Foundation Level syllabus, version 4.0.1 (sections 4.2.1 and 4.2.2).\u003C/p>\n\u003Ch2 id=\"history\" class=\"wiki-heading\">History\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"history\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The table lists the milestones in the description of the techniques.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Date\u003C/th>\n\u003Cth>Event\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>1979\u003C/td>\n\u003Ctd>The Art of Software Testing by Glenford Myers describes equivalence partitioning and boundary-value analysis\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>2015\u003C/td>\n\u003Ctd>First edition of ISO/IEC/IEEE 29119-4, test techniques\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>October 2021\u003C/td>\n\u003Ctd>Second edition of ISO/IEC/IEEE 29119-4: techniques are defined through test models instead of test conditions\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>21 April 2023\u003C/td>\n\u003Ctd>ISTQB CTFL syllabus v4.0 is formally released\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>15 September 2024\u003C/td>\n\u003Ctd>ISTQB CTFL syllabus v4.0.1, errata release; it describes 2-value and 3-value BVA and Each Choice coverage\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"the-problem-the-techniques-solve\" class=\"wiki-heading\">The problem the techniques solve\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"the-problem-the-techniques-solve\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Exhaustive testing is impossible for almost any real input. A quantity field that accepts integers has billions of possible values, and a form combines several fields. Values chosen at random give no argument that the important cases were checked.\u003C/p>\n\u003Cp>Equivalence partitioning replaces the set of all values with a small set of classes. If all values of a class are processed in the same way, a test with one of them says as much about the class as a test with any other.\u003C/p>\n\u003Cp>Partitioning alone does not say which value of a class to take. A requirement &quot;from 1 to 99&quot; can be implemented as \u003Ccode>quantity &lt; 99\u003C/code> instead of \u003Ccode>quantity &lt;= 99\u003C/code>. Every value in the middle of the class passes, only 99 fails. The ISTQB syllabus names this the typical defect found by boundary value analysis: an implemented boundary placed above or below its intended position, or missing.\u003C/p>\n\u003Ch2 id=\"equivalence-partitions\" class=\"wiki-heading\">Equivalence partitions\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"equivalence-partitions\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>An \u003Cstrong>equivalence partition\u003C/strong>, or equivalence class, is a subset of the possible values of a data element for which the test object is expected to behave in the same way. ISO/IEC/IEEE 29119-4 applies the term to both inputs and outputs.\u003C/p>\n\u003Ch3 id=\"valid-and-invalid-partitions\" class=\"wiki-heading\">Valid and invalid partitions\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"valid-and-invalid-partitions\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>A partition of values that the test object should accept is a valid partition. A partition of values that it should reject is an invalid partition. The ISTQB syllabus notes that teams and organizations may define valid and invalid values differently. The definition used in a project is therefore stated before the partitions are counted.\u003C/p>\n\u003Ch3 id=\"rules-for-partitions\" class=\"wiki-heading\">Rules for partitions\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"rules-for-partitions\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>Partitions can be identified for any data element related to the test object: inputs, outputs, configuration items, internal values, time-related values and interface parameters. Two rules apply to every set of partitions:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>No overlap.\u003C/strong> A value belongs to exactly one partition.\u003C/li>\n\u003Cli>\u003Cstrong>No empty partitions.\u003C/strong> Each partition contains at least one value. A partition may contain a single value, such as an empty string.\u003C/li>\n\u003C/ul>\n\u003Cp>Output partitions are found the same way: a tax calculation with three rates has three output partitions.\u003C/p>\n\u003Ch3 id=\"coverage-and-test-cases\" class=\"wiki-heading\">Coverage and test cases\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"coverage-and-test-cases\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>In equivalence partitioning the coverage items are the partitions, including the invalid ones. Coverage is the number of partitions exercised by at least one test case, divided by the total number of identified partitions, expressed as a percentage. One test case per partition is enough for 100 percent coverage.\u003C/p>\n\u003Cp>The Art of Software Testing gives a rule for invalid partitions: each test case covers one invalid partition only. The reason is masking: when a test case is invalid in two ways, the first check that rejects it hides the second. Valid partitions can be combined in one test case.\u003C/p>\n\u003Ch3 id=\"several-parameters-and-each-choice-coverage\" class=\"wiki-heading\">Several parameters and Each Choice coverage\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"several-parameters-and-each-choice-coverage\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>A test object with several parameters has a set of partitions for each of them. The ISTQB syllabus defines \u003Cstrong>Each Choice coverage\u003C/strong> for this case: each partition of each set is exercised by at least one test case. Combinations of partitions are not taken into account.\u003C/p>\n\u003Cp>The example below has two parameters: the quantity in an order with three partitions, and the payment method with three partitions.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Parameter\u003C/th>\n\u003Cth>Partitions\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Quantity\u003C/td>\n\u003Ctd>Below 1 (invalid), 1 to 99 (valid), above 99 (invalid)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Payment method\u003C/td>\n\u003Ctd>Card (valid), invoice (valid), unsupported method (invalid)\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Each Choice coverage needs at least three test cases, as many as the largest set has partitions. Three test cases, however, put two invalid values into one case. Under the rule of one invalid partition per test case, the set grows to five: two test cases combine the valid partitions, three contain one invalid value each.\u003C/p>\n\u003Cp>Combinations of partitions are the subject of other techniques: \u003Ca href=\"/en/wiki/test-design/decision-table-testing\" class=\"wiki-link wiki-link--article\">decision table testing\u003C/a> when the outcome depends on the combination, and \u003Ca href=\"/en/wiki/test-design/pairwise-testing\" class=\"wiki-link wiki-link--article\">pairwise testing\u003C/a> when the number of parameters is large.\u003C/p>\n\u003Ch2 id=\"boundary-value-analysis\" class=\"wiki-heading\">Boundary value analysis\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"boundary-value-analysis\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>A \u003Cstrong>boundary value\u003C/strong> is the minimum or maximum value of an ordered partition. Boundary value analysis can only be used for ordered partitions: numbers, lengths, dates and times. A payment method or a country has no order, so it has no boundaries.\u003C/p>\n\u003Ch3 id=\"two-value-boundary-value-analysis\" class=\"wiki-heading\">Two-value boundary value analysis\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"two-value-boundary-value-analysis\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>In \u003Cstrong>2-value boundary value analysis\u003C/strong>, each boundary value has two coverage items: the boundary value itself and its closest neighbor in the adjacent partition. For the valid partition 1 to 99 of integer quantities, the boundary values are 1 and 99, and the boundaries of the adjacent invalid partitions are 0 and 100. 2-value BVA gives four test values: 0, 1, 99 and 100.\u003C/p>\n\u003Ch3 id=\"three-value-boundary-value-analysis\" class=\"wiki-heading\">Three-value boundary value analysis\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"three-value-boundary-value-analysis\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>In \u003Cstrong>3-value boundary value analysis\u003C/strong>, each boundary value has three coverage items: the boundary value and both of its neighbors. For the boundary 1 the items are 0, 1 and 2; for the boundary 99 they are 98, 99 and 100.\u003C/p>\n\u003Cp>The syllabus calls 3-value BVA more rigorous and illustrates it with a defect. The requirement \u003Ccode>x &lt;= 10\u003C/code> is implemented as \u003Ccode>x = 10\u003C/code>. The 2-value test values 10 and 11 give the same results for both versions: 10 is accepted and 11 rejected. The value 9, which only 3-value BVA adds, is accepted by the requirement and rejected by the implementation.\u003C/p>\n\u003Ch3 id=\"coverage-formulas\" class=\"wiki-heading\">Coverage formulas\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"coverage-formulas\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The table shows the coverage items and the coverage measure of each technique as the ISTQB syllabus v4.0.1 defines them.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Technique\u003C/th>\n\u003Cth>Coverage items\u003C/th>\n\u003Cth>Coverage\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Equivalence partitioning\u003C/td>\n\u003Ctd>Partitions, valid and invalid\u003C/td>\n\u003Ctd>Partitions exercised / identified partitions\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>2-value BVA\u003C/td>\n\u003Ctd>Each boundary value and its closest neighbor in the adjacent partition\u003C/td>\n\u003Ctd>Boundary values exercised / identified boundary values\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>3-value BVA\u003C/td>\n\u003Ctd>Each boundary value and both its neighbors\u003C/td>\n\u003Ctd>Boundary values and neighbors exercised / all identified boundary values and neighbors\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Coverage is expressed as a percentage of the identified items: a partition that nobody identified does not lower it.\u003C/p>\n\u003Ch2 id=\"numbers\" class=\"wiki-heading\">Numbers\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"numbers\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Ch3 id=\"integer-range\" class=\"wiki-heading\">Integer range\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"integer-range\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The requirement is: the quantity of an item in an order is an integer from 1 to 99. The input field also receives values that are not integers.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Partition\u003C/th>\n\u003Cth>Values\u003C/th>\n\u003Cth>Type\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>P1\u003C/td>\n\u003Ctd>Integers below 1\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P2\u003C/td>\n\u003Ctd>Integers from 1 to 99\u003C/td>\n\u003Ctd>Valid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P3\u003C/td>\n\u003Ctd>Integers above 99\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P4\u003C/td>\n\u003Ctd>Decimal fractions, such as 2.5\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P5\u003C/td>\n\u003Ctd>Non-numeric text, such as \u003Ccode>abc\u003C/code>\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>P1 to P3 are ordered and have boundaries; P4 and P5 have none. The table shows the test values of each technique.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Technique\u003C/th>\n\u003Cth>Test values\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Equivalence partitioning\u003C/td>\n\u003Ctd>-5, 50, 150, 2.5, \u003Ccode>abc\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>2-value BVA\u003C/td>\n\u003Ctd>0, 1, 99, 100\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>3-value BVA\u003C/td>\n\u003Ctd>-1, 0, 1, 2, 98, 99, 100, 101\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The values 0 and 100 are boundaries of the invalid partitions P1 and P3. Their neighbors -1 and 101 appear in 3-value BVA. In pytest the values become a parameter list, and the test function runs once for each:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"python\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">python\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>import pytest\n\nfrom shop.cart import validate_quantity\n\n\n@pytest.mark.parametrize(\n    (&quot;quantity&quot;, &quot;valid&quot;),\n    [(-1, False), (0, False), (1, True), (2, True),\n     (98, True), (99, True), (100, False), (101, False)],\n)\ndef test_quantity_boundaries(quantity, valid):\n    assert validate_quantity(quantity) is valid\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Parameterized test cases are described in the article \u003Ca href=\"/en/wiki/test-management/test-case\" class=\"wiki-link wiki-link--article\">Test case\u003C/a>.\u003C/p>\n\u003Ch3 id=\"decimal-amount\" class=\"wiki-heading\">Decimal amount\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"decimal-amount\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The requirement is: a transfer amount from 0.01 to 10000.00 with at most two decimal places. The step between neighboring values is the smallest unit of the amount, 0.01. Without a step, a decimal partition has no closest neighbor, so the step is taken from the specification.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Partition\u003C/th>\n\u003Cth>Values\u003C/th>\n\u003Cth>Type\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>P1\u003C/td>\n\u003Ctd>Amounts up to 0.00\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P2\u003C/td>\n\u003Ctd>From 0.01 to 10000.00\u003C/td>\n\u003Ctd>Valid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P3\u003C/td>\n\u003Ctd>Above 10000.00\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>2-value BVA gives 0.00, 0.01, 10000.00 and 10000.01. 3-value BVA adds -0.01, 0.02, 9999.99 and 10000.02. The number of decimal places is a second parameter with its own partitions: up to two places (valid) and more than two places, such as 10.005 (invalid). It is a separate parameter: 10.005 lies inside P2 by value, and partitions of one set must not overlap.\u003C/p>\n\u003Cp>The type of the value matters. The Python documentation notes that numbers like 1.1 and 2.2 have no exact representation in binary floating point, unlike a decimal type. A comparison of a binary floating-point amount at the boundary can give an unexpected result.\u003C/p>\n\u003Ch2 id=\"strings\" class=\"wiki-heading\">Strings\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"strings\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The requirement is: a user name is 3 to 20 characters long and contains Latin letters, digits and underscores. A string has two independent sets of partitions: by length and by characters.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Parameter\u003C/th>\n\u003Cth>Partition\u003C/th>\n\u003Cth>Type\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Length\u003C/td>\n\u003Ctd>0, empty string\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Length\u003C/td>\n\u003Ctd>1 to 2\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Length\u003C/td>\n\u003Ctd>3 to 20\u003C/td>\n\u003Ctd>Valid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Length\u003C/td>\n\u003Ctd>21 and more\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Characters\u003C/td>\n\u003Ctd>Only letters, digits, underscores\u003C/td>\n\u003Ctd>Valid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Characters\u003C/td>\n\u003Ctd>At least one other character, such as a space or \u003Ccode>-\u003C/code>\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The empty string is a separate partition when the system processes it differently, for example with the message that the field is required. Length is ordered, so the length partitions have boundaries. 2-value BVA gives strings of lengths 0, 1, 2, 3, 20 and 21. 3-value BVA adds lengths 4, 19 and 22; a length of -1 does not exist, so the boundary 0 has only one neighbor. Characters have no order, and their partitions are covered by equivalence partitioning only.\u003C/p>\n\u003Cp>The unit of length is part of the boundary. The JSON Schema keywords \u003Ccode>minLength\u003C/code> and \u003Ccode>maxLength\u003C/code> count characters as defined by RFC 8259. The JavaScript property \u003Ccode>length\u003C/code> and the HTML attribute \u003Ccode>maxlength\u003C/code> count UTF-16 code units, so an emoji has a length of 2. A Python \u003Ccode>str\u003C/code> is a sequence of Unicode code points, and \u003Ccode>len()\u003C/code> returns 1 for the same emoji. A user name of 20 characters with one emoji is therefore 20 long for one component and 21 for another. Input schemas of MCP tools use the same JSON Schema keywords; they are described in the article \u003Ca href=\"/en/wiki/mcp/mcp-tools\" class=\"wiki-link wiki-link--article\">Tools in MCP\u003C/a>.\u003C/p>\n\u003Ch2 id=\"dates\" class=\"wiki-heading\">Dates\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"dates\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Dates are ordered. The step is one day, or smaller when time is part of the value.\u003C/p>\n\u003Ch3 id=\"date-range\" class=\"wiki-heading\">Date range\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"date-range\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The requirement is: a delivery can be booked from tomorrow up to 90 days ahead. With the current date 3 November 2026, the partitions are:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Partition\u003C/th>\n\u003Cth>Dates\u003C/th>\n\u003Cth>Type\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>P1\u003C/td>\n\u003Ctd>Up to 2026-11-03\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P2\u003C/td>\n\u003Ctd>From 2026-11-04 to 2027-02-01\u003C/td>\n\u003Ctd>Valid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>P3\u003C/td>\n\u003Ctd>From 2027-02-02\u003C/td>\n\u003Ctd>Invalid\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>2-value BVA gives 2026-11-03, 2026-11-04, 2027-02-01 and 2027-02-02. 3-value BVA adds 2026-11-02, 2026-11-05, 2027-01-31 and 2027-02-03. The boundaries depend on the current date, and the current date depends on the time zone. Tests of such a requirement fix the clock and the time zone of the test object; otherwise the same data fall into different partitions on different days.\u003C/p>\n\u003Ch3 id=\"leap-years-and-end-of-month\" class=\"wiki-heading\">Leap years and end of month\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"leap-years-and-end-of-month\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The valid days of a month depend on the month and, for February, on the year. In the Gregorian calendar a year is a leap year if it is divisible by 4, except years divisible by 100 that are not divisible by 400. The year therefore has four partitions, one for each branch of the rule:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Partition\u003C/th>\n\u003Cth>Example\u003C/th>\n\u003Cth>February\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Divisible by 400\u003C/td>\n\u003Ctd>2000\u003C/td>\n\u003Ctd>29 days\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Divisible by 100, not by 400\u003C/td>\n\u003Ctd>2100\u003C/td>\n\u003Ctd>28 days\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Divisible by 4, not by 100\u003C/td>\n\u003Ctd>2028\u003C/td>\n\u003Ctd>29 days\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Not divisible by 4\u003C/td>\n\u003Ctd>2027\u003C/td>\n\u003Ctd>28 days\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>For each month the last valid day is a boundary, and the next day is its neighbor in the invalid partition. The Python \u003Ccode>calendar\u003C/code> module uses the proleptic Gregorian calendar, and \u003Ccode>calendar.monthrange()\u003C/code> returns the number of days in a month. The script prints the pairs for 2-value BVA:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"python\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">python\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>import calendar\n\nfor year, month in [(2027, 2), (2028, 2), (2100, 2), (2026, 4), (2026, 12)]:\n    last_day = calendar.monthrange(year, month)[1]\n    print(year, month, &quot;valid:&quot;, last_day, &quot;invalid:&quot;, last_day + 1)\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>The output gives 28 and 29 for February 2027 and 2100, 29 and 30 for February 2028, 30 and 31 for April, 31 and 32 for December. The lower boundary is the same for every month: day 1 is valid, day 0 is not.\u003C/p>\n\u003Ch2 id=\"combination-with-decision-tables\" class=\"wiki-heading\">Combination with decision tables\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"combination-with-decision-tables\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Equivalence partitioning and boundary value analysis treat parameters one at a time. When the outcome depends on a combination of conditions, a \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"decision-table\">decision table\u003C/span> describes the combinations. Its conditions are often partitions, for example &quot;order total: below 100.00, 100.00 and above&quot;. Each rule of the table is then a combination of partitions, the values of its test case are taken from them, and boundary values add test cases at the edges of each condition. The tables are described in the article \u003Ca href=\"/en/wiki/test-design/decision-table-testing\" class=\"wiki-link wiki-link--article\">Decision table testing\u003C/a>.\u003C/p>\n\u003Ch2 id=\"where-the-techniques-do-not-help\" class=\"wiki-heading\">Where the techniques do not help\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"where-the-techniques-do-not-help\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The techniques assume that all values of a partition are processed in the same way. When the assumption is wrong, the chosen values say nothing about the rest of the class. Several situations fall outside their scope:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Unordered data.\u003C/strong> Payment methods, countries and file types have partitions but no boundaries.\u003C/li>\n\u003Cli>\u003Cstrong>Combinations.\u003C/strong> A defect that appears only for a certain pair of values is not found by varying one parameter at a time.\u003C/li>\n\u003Cli>\u003Cstrong>Behavior that depends on history.\u003C/strong> The same input can be valid in one state and invalid in another: the subject of \u003Ca href=\"/en/wiki/test-design/state-transition-testing\" class=\"wiki-link wiki-link--article\">state transition testing\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Sequences of actions.\u003C/strong> Scenarios with alternative flows are the subject of \u003Ca href=\"/en/wiki/test-design/use-case-testing\" class=\"wiki-link wiki-link--article\">use case testing\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Boundaries not in the specification.\u003C/strong> A 32-bit signed integer has a maximum of 2147483647. Such limits come from the implementation, and the specification does not reveal them.\u003C/li>\n\u003C/ul>\n\u003Cp>The partitions are only as correct as the specification they come from. A missing requirement leaves no partition, and no test checks it.\u003C/p>\n\u003Ch2 id=\"equivalence-partitioning-and-related-techniques\" class=\"wiki-heading\">Equivalence partitioning and related techniques\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"equivalence-partitioning-and-related-techniques\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The table compares the techniques of this article with the other black-box techniques with which they are combined.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Technique\u003C/th>\n\u003Cth>Test model\u003C/th>\n\u003Cth>What it covers\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Equivalence partitioning\u003C/td>\n\u003Ctd>Partitions of each data element\u003C/td>\n\u003Ctd>Each class at least once\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Boundary value analysis\u003C/td>\n\u003Ctd>Ordered partitions and their edges\u003C/td>\n\u003Ctd>Boundaries and their neighbors\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Decision table testing\u003C/td>\n\u003Ctd>Conditions, actions and rules\u003C/td>\n\u003Ctd>Feasible combinations of conditions\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Pairwise testing\u003C/td>\n\u003Ctd>Parameters and their values\u003C/td>\n\u003Ctd>Every pair of values of any two parameters\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Equivalence partitioning is the basis of the others: boundary value analysis refines it inside ordered partitions, decision tables and \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"pairwise-testing\">pairwise testing\u003C/span> use partitions as values and add combinations.\u003C/p>\n\u003Cp>ISO/IEC/IEEE 29119-4 also lists the classification tree method among the specification-based techniques. The choice depends on whether the outcome depends on single values, on edges or on combinations.\u003C/p>\n\u003Ch2 id=\"terms\" class=\"wiki-heading\">Terms\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"terms\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Term\u003C/th>\n\u003Cth>Meaning\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Equivalence partitioning\u003C/td>\n\u003Ctd>Black-box test technique in which test cases exercise each partition of values expected to be processed the same way\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Equivalence partition\u003C/td>\n\u003Ctd>Subset of the values of a data element for which the test object is expected to behave in the same way\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Valid partition\u003C/td>\n\u003Ctd>Partition of values that the test object should accept\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Invalid partition\u003C/td>\n\u003Ctd>Partition of values that the test object should reject\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Each Choice coverage\u003C/td>\n\u003Ctd>Coverage in which each partition of each parameter is exercised at least once, without regard to combinations\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Boundary value\u003C/td>\n\u003Ctd>Minimum or maximum value of an ordered partition\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Boundary value analysis\u003C/td>\n\u003Ctd>Black-box test technique in which test cases are derived from boundary values of ordered partitions\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>2-value boundary value analysis\u003C/td>\n\u003Ctd>Variant of boundary value analysis with two coverage items per boundary: the boundary and its closest neighbor in the adjacent partition\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>3-value boundary value analysis\u003C/td>\n\u003Ctd>Variant of boundary value analysis with three coverage items per boundary: the boundary and both its neighbors\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"sources\" class=\"wiki-heading\">Sources\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"sources\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.istqb.org/wp-content/uploads/2024/11/ISTQB_CTFL_Syllabus_v4.0.1.pdf\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISTQB Certified Tester Foundation Level Syllabus v4.0.1, sections 4.2.1 and 4.2.2, ISTQB, 2024\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://glossary.istqb.org/\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISTQB Glossary\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.imbus.de/en/glossar/term/equivalence-partitioning\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISTQB Glossary mirror: equivalence partitioning, imbus\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.imbus.de/en/glossar/term/boundary-value\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISTQB Glossary mirror: boundary value, imbus\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.iso.org/standard/79430.html\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">ISO/IEC/IEEE 29119-4:2021, Software testing, Part 4: Test techniques, ISO\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.oreilly.com/library/view/the-art-of/9781118133156/\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">The Art of Software Testing, 3rd Edition, Glenford J. Myers, Tom Badgett, Corey Sandler, Wiley, 2011\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://agileconnection.com/print/book/art-software-testing\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Review of The Art of Software Testing, AgileConnection\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://json-schema.org/draft/2020-12/json-schema-validation\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">JSON Schema Validation, draft 2020-12, sections 6.2 and 6.3\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">String: length, MDN Web Docs\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/maxlength\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">HTML attribute: maxlength, MDN Web Docs\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://docs.python.org/3/library/calendar.html\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">calendar, Python documentation\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://docs.python.org/3/library/decimal.html\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">decimal, Python documentation\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://docs.pytest.org/en/stable/how-to/parametrize.html\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">How to parametrize fixtures and test functions, pytest documentation\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003C/ul>\n",[10,14,17,20,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78],{"id":11,"level":12,"text":13},"history",2,"History",{"id":15,"level":12,"text":16},"the-problem-the-techniques-solve","The problem the techniques solve",{"id":18,"level":12,"text":19},"equivalence-partitions","Equivalence partitions",{"id":21,"level":22,"text":23},"valid-and-invalid-partitions",3,"Valid and invalid partitions",{"id":25,"level":22,"text":26},"rules-for-partitions","Rules for partitions",{"id":28,"level":22,"text":29},"coverage-and-test-cases","Coverage and test cases",{"id":31,"level":22,"text":32},"several-parameters-and-each-choice-coverage","Several parameters and Each Choice coverage",{"id":34,"level":12,"text":35},"boundary-value-analysis","Boundary value analysis",{"id":37,"level":22,"text":38},"two-value-boundary-value-analysis","Two-value boundary value analysis",{"id":40,"level":22,"text":41},"three-value-boundary-value-analysis","Three-value boundary value analysis",{"id":43,"level":22,"text":44},"coverage-formulas","Coverage formulas",{"id":46,"level":12,"text":47},"numbers","Numbers",{"id":49,"level":22,"text":50},"integer-range","Integer range",{"id":52,"level":22,"text":53},"decimal-amount","Decimal amount",{"id":55,"level":12,"text":56},"strings","Strings",{"id":58,"level":12,"text":59},"dates","Dates",{"id":61,"level":22,"text":62},"date-range","Date range",{"id":64,"level":22,"text":65},"leap-years-and-end-of-month","Leap years and end of month",{"id":67,"level":12,"text":68},"combination-with-decision-tables","Combination with decision tables",{"id":70,"level":12,"text":71},"where-the-techniques-do-not-help","Where the techniques do not help",{"id":73,"level":12,"text":74},"equivalence-partitioning-and-related-techniques","Equivalence partitioning and related techniques",{"id":76,"level":12,"text":77},"terms","Terms",{"id":79,"level":12,"text":80},"sources","Sources",2727,1793718916013]