junit junit_JUnit理论简介
junit junit
您讀過數(shù)學(xué)理論嗎?
它通常讀取如下內(nèi)容:
對(duì)于所有a,b> 0滿足以下條件:a + b> a和a + b> b
通常,這些語句更難以理解。
這種陳述有一些有趣的地方:它適用于相當(dāng)大(在這種情況下為無限)集合的每個(gè)元素(或元素組合)。
將其與典型測(cè)試的陳述進(jìn)行比較:
@Testpublic void a_plus_b_is_greater_than_a_and_greater_than_b(){int a = 2;int b = 3;assertTrue(a + b > a);assertTrue(a + b > b);}這僅是關(guān)于我們所討論的大集合中單個(gè)元素的陳述。 不太令人印象深刻。 當(dāng)然,我們可以通過遍歷測(cè)試(或使用參數(shù)化測(cè)試 )來解決此問題:
@Testpublic void a_plus_b_is_greater_than_a_and_greater_than_b_multiple_values() {List<Integer> values = Arrays.asList(1, 2, 300, 400000);for (Integer a : values)for (Integer b : values) {assertTrue(a + b > a);assertTrue(a + b > b);}}當(dāng)然,這仍然僅測(cè)試了一些值,但是也變得非常難看。 我們正在使用9行代碼來測(cè)試數(shù)學(xué)家在一行中寫的內(nèi)容! 這種關(guān)系對(duì)于任何值a,b都應(yīng)保持的要點(diǎn)在翻譯中完全消失了。
但是仍然有希望: JUnit理論 。 讓我們看看使用該漂亮工具的測(cè)試情況:
import org.junit.experimental.theories.DataPoints; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith;import static org.junit.Assert.assertTrue;@RunWith(Theories.class) public class AdditionWithTheoriesTest {@DataPointspublic static int[] positiveIntegers() {return new int[]{1, 10, 1234567};}@Theorypublic void a_plus_b_is_greater_than_a_and_greater_than_b(Integer a, Integer b) {assertTrue(a + b > a);assertTrue(a + b > b);} }使用JUnit理論,測(cè)試分為兩個(gè)獨(dú)立部分:提供數(shù)據(jù)點(diǎn)(即用于測(cè)試的值)的方法以及理論本身。 該理論看起來幾乎像是一個(gè)測(cè)試,但是它具有不同的注釋(@Theory)并且需要參數(shù)。 類中的理論將與數(shù)據(jù)點(diǎn)的每種可能組合一起執(zhí)行。
這意味著,如果我們對(duì)測(cè)試主題有一個(gè)以上的理論,則只需聲明數(shù)據(jù)點(diǎn)一次。 因此,讓我們添加以下理論,這對(duì)于加法而言應(yīng)該是正確的:a + b = b + a因此,我們將以下理論添加到我們的類@Theory中public void add_is_commutative(Integer a,Integer b){assertTrue(a + b == b + a); }
這就像一種魅力,并且可以開始看到它實(shí)際上也節(jié)省了一些代碼,因?yàn)槲覀儾恢貜?fù)數(shù)據(jù)點(diǎn)。 但是,我們僅使用正整數(shù)進(jìn)行測(cè)試,而可交換屬性應(yīng)適用于所有整數(shù)! 當(dāng)然,我們的第一個(gè)理論仍然只適用于正數(shù)
也有一個(gè)解決方案: 假設(shè) 。 假設(shè)您可以檢查理論的先決條件。 如果對(duì)于給定的參數(shù)集不正確,則該理論將被跳過。 所以我們的測(cè)試現(xiàn)在看起來像這樣:
@RunWith(Theories.class)public class AdditionWithTheoriesTest {@DataPointspublic static int[] integers() {return new int[]{-1, -10, -1234567,1, 10, 1234567};}@Theorypublic void a_plus_b_is_greater_than_a_and_greater_than_b(Integer a, Integer b) {Assume.assumeTrue(a >0 && b > 0 );assertTrue(a + b > a);assertTrue(a + b > b);}@Theorypublic void addition_is_commutative(Integer a, Integer b) {assertTrue(a + b == b + a);} }這使測(cè)試表現(xiàn)力很好。
將測(cè)試數(shù)據(jù)與測(cè)試/理論實(shí)現(xiàn)分開,除了簡(jiǎn)潔以外,還可以帶來另一個(gè)積極的效果:您可能會(huì)開始考慮與實(shí)際測(cè)試內(nèi)容無關(guān)的測(cè)試數(shù)據(jù)。
讓我們做到這一點(diǎn)。 如果要測(cè)試采用整數(shù)參數(shù)的方法,那么哪些整數(shù)可能會(huì)引起問題? 這是我的建議:
@DataPointspublic static int[] integers() {return new int[]{0, -1, -10, -1234567,1, 10, 1234567, Integer.MAX_VALUE, Integer.MIN_VALUE};}在我們的示例中,哪個(gè)當(dāng)然會(huì)導(dǎo)致測(cè)試失敗。 如果在Integer.MAX_VALUE中添加一個(gè)正整數(shù),則會(huì)溢出! 因此,我們剛剛得知我們目前的理論是錯(cuò)誤的! 是的,我知道這很明顯,但是請(qǐng)看一下當(dāng)前項(xiàng)目中的測(cè)試。 使用整數(shù)的所有測(cè)試是否都以MIN_VALUE,MAX_VALUE,0,正值和負(fù)值測(cè)試? 是的,是這樣。
那更復(fù)雜的對(duì)象呢? 琴弦? 日期? 收藏? 還是領(lǐng)域?qū)ο?#xff1f; 使用JUnit Theories,您可以設(shè)置測(cè)試數(shù)據(jù)生成器一次,以創(chuàng)建所有容易產(chǎn)生問題的場(chǎng)景,然后使用這些理論在所有測(cè)試中重用這些場(chǎng)景。 這將使您的測(cè)試更具表現(xiàn)力,并提高發(fā)現(xiàn)錯(cuò)誤的可能性。
翻譯自: https://www.javacodegeeks.com/2013/12/introduction-to-junit-theories.html
junit junit
總結(jié)
以上是生活随笔為你收集整理的junit junit_JUnit理论简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 窘的读音 窘怎么读
- 下一篇: Jenkins在AWS上(第1部分)