2015-11-20 21 views
0

我的任務是測試我的Statslist的合理投入,可能會使用我的StatsList類。對於如何爲這些問題提供單元測試,我感到非常困惑。我已經正確地完成了第一堂課。這些問題是:UnitTesting的問題來檢查我的編碼

  1. 什麼是數,平均數,中位數,而空單的模式(StatsList,沒有什麼一直追加到)?

  2. 帶有一個值的列表的計數,平均值,中位數和模式是什麼?

  3. 有兩個值的列表的計數,平均值,中位數和模式是什麼?

  4. 如果值的插入順序錯誤(如上例所示),中位數是否仍然有效?

  5. 如果按順序插入值,中位數是否仍然有效?

  6. 如果有多個值都顯示相同的次數,那麼模式是什麼?

編碼: 進口單元測試 進口statslist

class StatsTest(unittest.TestCase): 
    def test_Append(self): 
     sl = statslist.StatsList() 

     self.assertEqual(0, sl.count()) 
     sl.append(10) 
     self.assertEqual(1, sl.count()) 

    def test_OneValue(self): 



    def test_Mean(self): 
     self.assert 

    def test_Median(self): 


    def test_Mode(self): 



if __name__ == '__main__': 
    unittest.main() 

編碼StatsList:

class StatsList: 
     def __init__(self): 
     self.sum = 0 
     self.nums = [] 

    def append(self, number): 
     self.nums.append(number) 

    def count(self): 
     count = len(self.nums) 
     return count 

    def mean(self): 
     for num in self.nums: 
      self.sum = self.sum + num 

     return self.sum /len(self.nums) 

    def median(self): 
     self.nums.sort() 
     midPos = self.count() // 2 

     if self.count() % 2 == 0: 
      median = (nums[midPos] + nums[midPos-1])/2.0 
     else: 
      median = self.nums[midPos] 

     return median 

    def mode(self): 
     counts= {} 
     for num in self.nums: 
      counts[num] = counts.get(num,0) + 1 
      mode = max(counts, key = counts.get) 

     return mode 

def byFreq(pair): 
    return pair[1] 

def main(): 
    l = StatsList() 
    l.append(1) 
    l.append(11) 
    l.append(3) 
    l.append(1) 
    l.append(4) 

    print("Count:", l.count()) # should print 5 
    print("Mean:", l.mean()) # should print 4.0 
    print("Median:", l.median()) # should print 3 
    print("Mode:", l.mode()) # should print 1 


if __name__ == '__main__': 
    main() 

回答

2

你可以寫這樣的事情:

import unittest 
import statslist 

class StatsTest(unittest.TestCase): 
    def test_append(self): 
     sl = statslist.StatsList() 

     self.assertEqual(0, sl.count()) 
     sl.append(10) 
     self.assertEqual(1, sl.count()) 

    def test_one_value(self): 
     # given 
     sl = statslist.StatsList() 

     # when 
     sl.append(10) 

     # then 
     self.assertEqual(1, sl.count()) 
     self.assertEqual(10, sl.mean()) 
     self.assertEqual(10, sl.median()) 
     self.assertEqual(10, sl.mode()) 

    def test_two_values(self): 
     # given 
     sl = statslist.StatsList() 

     # when 
     sl.append(10) 
     sl.append(11) 

     # then 
     self.assertEqual(1, sl.count()) 
     self.assertEqual(10, sl.mean()) 
     self.assertEqual(10, sl.median()) 
     self.assertEqual(10, sl.mode()) 

    def test_median_wrong_order(self): 
     # given 
     sl = statslist.StatsList() 

     # when 
     sl.append(12) 
     sl.append(13) 
     sl.append(11) 

     # then 
     self.assertEqual(12, sl.median()) 

    def test_median_in_order(self): 
     # given 
     sl = statslist.StatsList() 

     # when 
     sl.append(11) 
     sl.append(12) 
     sl.append(13) 

     # then 
     self.assertEqual(12, sl.median()) 

    def test_mode_with_multiple_vals_same_num_of_times(self): 
     # given 
     sl = statslist.StatsList() 

     # when 
     sl.append(11) 
     sl.append(11) 
     sl.append(12) 
     sl.append(12) 
     sl.append(13) 

     # then 
     self.assertEqual(11, sl.mode()) 

單元測試的想法是確保你的代碼實際上按照它應該的方式工作。這是一種很好的方法,可以及早發現錯誤,並防止您花費無數小時來調試剛剛在生產中發生的奇怪錯誤。

你的單元測試應該覆蓋所有(或大多數)邊緣情況。這帶來了一個額外的好處:它會自動記錄你的代碼,並且稍後幫助其他人重構你的代碼,因爲它們可以運行單元測試,並且如果重構後出現錯誤,這可能意味着他們做錯了什麼。

根據您的需要,您可以改進您的代碼,以便在添加元素時自動跟蹤統計信息。這會使mean(),median(),count()mode()O(1)的複雜度執行,然而取決於所使用的算法,它可能會減慢append()方法。