2014年11月14日金曜日

開発環境

Practical Programming: An Introduction to Computer Science Using Python 3 (Pragmatic Programmers) (Paul Gries (著)、Jennifer Campbell (著)、Jason Montojo (著)、Lynn Beighley (編集)、Pragmatic Bookshelf)のChapter 15(Testing and Debugging)、15.7(Exercises) 6-a, b.を解いてみる。

15.7(Exercises) 6-a, b.

コード(BBEdit)

test_average.py

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import unittest
import sample6
import sample6_fixed

class TestAverage(unittest.TestCase):
    def test_empty(self):
        values = []
        expected = None
        actual =  sample6.average(values)
        self.assertEqual(expected, actual)
    def test_one(self):
        values = [10]
        expected = 10
        actual = sample6.average(values)
        self.assertEqual(expected, actual)
    def test_two(self):
        values = [10, 20]
        expected = 15
        actual = sample6.average(values)
        self.assertEqual(expected, actual)
    def test_include_none(self):
        values = [None, 10, 20]
        expected = 15
        actual = sample6.average(values)
        self.assertEqual(expected, actual)

class TestAverageFixed(unittest.TestCase):
    def test_empty(self):
        values = []
        expected = None
        actual =  sample6_fixed.average(values)
        self.assertEqual(expected, actual)
    def test_one(self):
        values = [10]
        expected = 10
        actual = sample6_fixed.average(values)
        self.assertEqual(expected, actual)
    def test_two(self):
        values = [10, 20]
        expected = 15
        actual = sample6_fixed.average(values)
        self.assertEqual(expected, actual)
    def test_include_none(self):
        values = [None, 10, 20]
        expected = 15
        actual = sample6_fixed.average(values)
        self.assertEqual(expected, actual)

unittest.main()

sample6_fixed.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def average(values):
    """ (list of number) -> number
    Return the average of the numbers in values.  Some items in values are
    None, and they are not counted toward the average.
    >>> average([20, 30])
    25.0
    >>> average([None, 20, 30])
    25.0
    """
    count = 0  # The number of values seen so far.
    total = 0  # The sum of the values seen so far.
    for value in values:
        if not value is None:
            total += value
            count += 1
    if count == 0:
        return None
    return total / count

入出力結果(Terminal, IPython)

$ ./test_average.py 
EF......
======================================================================
ERROR: test_empty (__main__.TestAverage)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./test_average.py", line 12, in test_empty
    actual =  sample6.average(values)
  File "/Users/kamimura/Documents/py/prac_prog/ch15/sample6.py", line 19, in average
    return total / count
ZeroDivisionError: division by zero

======================================================================
FAIL: test_include_none (__main__.TestAverage)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./test_average.py", line 28, in test_include_none
    self.assertEqual(expected, actual)
AssertionError: 15 != 10.0

----------------------------------------------------------------------
Ran 8 tests in 0.004s

FAILED (failures=1, errors=1)
$

0 コメント:

コメントを投稿