簡體   English   中英

在這種情況下有多少個測試用例?

[英]How many test cases in this scenario?

我有一個方法可以執行許多操作,因此意味着會產生許多副作用。 例如,說一次對REST API的調用將返回設置了許多字段的JSON對象。 在這種情況下,如果我們要檢查每個單獨的字段,我們應該有一個包含多個assertEquals的單一測試方法,還是每個字段驗證包含一個assertEquals的單一測試方法。

同樣,一種方法可能會有很多其他副作用,例如,保存到數據庫,發送電子郵件等。在這種情況下,我應該針對每種副作用使用一種單元測試方法嗎?

另外,如果每個SUT方法有多個測試輸入,那么這會影響創建多少個測試方法的決定嗎?

而且,可能與故事有關,這意味着故事是這樣說的,在這種情況下,該子功能屬於故事,它們是否應該屬於同一測試方法? 因為如果需求發生變化,那么也需要改變所有影響方方面面的測試方法。 那可以管理嗎?

在這種情況下,如果我們要檢查每個單獨的字段,我們應該有一個包含多個assertEquals的單一測試方法,還是每個字段驗證包含一個assertEquals的單一測試方法。

擔心測試用例中斷言的數量就像擔心函數中有多少行。 這是復雜度的一階近似,但並不是您真正應該關注的。

您應該關心的是該測試的維護難度和診斷性能。 如果測試失敗,您能否找出原因? 這很大程度上取決於您的assertEquals對大型數據結構的性能如何。

json = call_rest();
want = { ...whatever you expect... };
assertEquals( json.from_json(), want );

如果那只是告訴您它們不相等,那不是很有用。 然后,您必須手動進入並查看jsonwant 如果它轉儲了兩個數據結構,那也就不是很有用,您必須逐一尋找差異。

但是,如果它表示兩個數據結構的有用區別,那將是有用的。 例如,Perl的Test2將產生這樣的診斷信息。

use Test2::Bundle::Extended;

is { foo => 23, bar => 42, baz => 99 },
   { foo => 22, bar => 42, zip => 99 };

done_testing;

# +-------+------------------+---------+------------------+
# | PATH  | GOT              | OP      | CHECK            |
# +-------+------------------+---------+------------------+
# | {foo} | 23               | eq      | 22               |
# | {zip} | <DOES NOT EXIST> |         | 99               |
# | {baz} | 99               | !exists | <DOES NOT EXIST> |
# +-------+------------------+---------+------------------+

然后是維護問題,這又assertEquals您的assertEquals有多好。 單個assertEquals易於閱讀和維護。

json = call_rest();
want = { ...whatever you expect... };
assertEquals( json.from_json(), want );

有很少的代碼,並且want是什么預期非常明確。

雖然倍數非常羅word。

json = call_rest();
have = json.from_json();
assertEquals( have['thiskey'], 23 );
assertEquals( have['thatkey'], 42 );
assertEquals( have['foo'], 99 );
...and so on...

可能很難知道哪個斷言失敗,您必須通過行號或(如果測試套件支持)行號來手動命名每個斷言,這需要更多的工作,更多的維護和更多的出錯。

OTOH個人assertEquals允許更大的靈活性。 例如,如果您只想檢查某些字段怎么辦? 如果范圍內有可接受的值怎么辦?

# bar just has to contain a number
assert( have['bar'].is_number );

但是某些測試套件通過單個斷言來支持這一點。

want = {
    thiskey: 23,
    thatkey: 42,
    foo:     99,
    bar:     is_number
}

assertEquals( json.from_json, want );

is_number是一個特殊的對象,它告訴斷言這不是正常的質量檢查,而只是檢查該值是否為數字。 如果您的測試套件支持這種樣式,則通常優於編寫一堆斷言。 聲明式方法意味着更少的代碼編寫,讀取和維護。

答案是:這取決於您的測試工具有多好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM