我的任务是测试我的Statslist以获取可能使用我的StatsList类的合理输入。我对如何为这些问题进行单元测试感到非常困惑。我在课堂上正确完成了第一个。问题是:
空列表的计数,平均值,中位数和模式是什么(没有附加任何内容的StatsList)?
具有一个值的列表的计数,均值,中位数和模式是什么?
具有两个值的列表的计数,均值,中位数和模式是什么?
如果以错误的顺序插入值(如上例所示),中位数是否仍然有效?
如果按顺序插入值,中位数是否仍然有效?
如果有多个值都显示相同的次数,该模式将是什么?
编码: 进口单位测试 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_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()
答案 0 :(得分: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)
复杂度执行,但是根据所使用的算法,它可能会降低{{1}方法。