Python测试驱动开发的14个实战案例

引言

测试驱动开发(Test-Driven Development, TDD)是一种软件开发方法论,它要求在编写实际代码之前先编写测试。TDD 的核心思想是“小步快跑”,即每次只实现一个非常小的功能,然后立即编写测试以验证这个功能是否按预期工作。这种方式不仅有助于提高代码质量,还能确保代码的正确性和可维护性。

文末有惊喜福利

案例1:加法函数

假设我们需要实现一个简单的加法函数 add(a, b)。首先,我们来编写测试:

import unittest

def add(a, b):
    return a + b

class TestAddition(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(0, 0), 0)

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

再次运行测试,这次应该通过了。这样我们就完成了第一个测试驱动开发的小例子。

案例2:字符串反转

接下来,我们尝试实现一个字符串反转函数 reverse_string(s)。同样,先写测试:

class TestStringReverse(unittest.TestCase):

    def test_reverse_string(self):
        self.assertEqual(reverse_string("hello"), "olleh")
        self.assertEqual(reverse_string(""), "")
        self.assertEqual(reverse_string("a"), "a")

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

然后实现函数:

def reverse_string(s):
    return s[::-1]

再次运行测试,确认无误。

案例3:计算阶乘

编写一个计算阶乘的函数 factorial(n),其中 n 是非负整数。测试如下:

class TestFactorial(unittest.TestCase):

    def test_factorial(self):
        self.assertEqual(factorial(0), 1)
        self.assertEqual(factorial(1), 1)
        self.assertEqual(factorial(5), 120)

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

实现函数:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

案例4:检查回文字符串

编写一个函数 is_palindrome(s) 来判断给定字符串是否为回文串。测试代码如下:

class TestPalindrome(unittest.TestCase):

    def test_is_palindrome(self):
        self.assertTrue(is_palindrome("racecar"))
        self.assertFalse(is_palindrome("hello"))
        self.assertTrue(is_palindrome(""))

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

实现函数:

def is_palindrome(s):
    return s == s[::-1]

案例5:列表去重

实现一个函数 unique_elements(lst),返回列表中的唯一元素。测试代码如下:

class TestUniqueElements(unittest.TestCase):

    def test_unique_elements(self):
        self.assertEqual(unique_elements([1, 2, 2, 3]), [1, 2, 3])
        self.assertEqual(unique_elements([1, 1, 1, 1]), [1])
        self.assertEqual(unique_elements([]), [])

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

实现函数:

def unique_elements(lst):
    return list(set(lst))

案例6:计算平均值

编写一个函数 average(lst) 来计算列表中所有数字的平均值。测试代码如下:

class TestAverage(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([1, 2, 3, 4, 5]), 3)
        self.assertEqual(average([10, 20, 30]), 20)
        with self.assertRaises(ZeroDivisionError):
            average([])

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

实现函数:

def average(lst):
    if not lst:
        raise ZeroDivisionError("Cannot calculate average of an empty list.")
    return sum(lst) / len(lst)

案例7:查找最大值

实现一个函数 find_max(lst) 来查找列表中的最大值。测试代码如下:

class TestFindMax(unittest.TestCase):

    def test_find_max(self):
        self.assertEqual(find_max([1, 2, 3, 4, 5]), 5)
        self.assertEqual(find_max([-1, -2, -3, -4, -5]), -1)
        with self.assertRaises(ValueError):
            find_max([])

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

实现函数:

def find_max(lst):
    if not lst:
        raise ValueError("List cannot be empty.")
    return max(lst)

案例8:字符串替换

编写一个函数 replace_substring(s, old, new) 来替换字符串中的子串。测试代码如下:

class TestReplaceSubstring(unittest.TestCase):

    def test_replace_substring(self):
        self.assertEqual(replace_substring("hello world", "world", "Python"), "hello Python")
        self.assertEqual(replace_substring("aaa", "a", "b"), "bbb")

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

实现函数:

def replace_substring(s, old, new):
    return s.replace(old, new)

案例9:检查质数

编写一个函数 is_prime(n) 来判断一个给定的整数是否为质数。测试代码如下:

class TestIsPrime(unittest.TestCase):

    def test_is_prime(self):
        self.assertTrue(is_prime(2))
        self.assertTrue(is_prime(3))
        self.assertFalse(is_prime(4))
        self.assertTrue(is_prime(5))
        self.assertFalse(is_prime(9))

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

实现函数:

def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

案例10:计算斐波那契数列

编写一个函数 fibonacci(n) 来计算第 n 个斐波那契数。测试代码如下:

class TestFibonacci(unittest.TestCase):

    def test_fibonacci(self):
        self.assertEqual(fibonacci(0), 0)
        self.assertEqual(fibonacci(1), 1)
        self.assertEqual(fibonacci(5), 5)
        self.assertEqual(fibonacci(10), 55)

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

实现函数:

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        a, b = 0, 1
        for _ in range(2, n + 1):
            a, b = b, a + b
        return b

案例11:统计字符串中的字符出现次数

编写一个函数 count_chars(s) 来统计字符串中每个字符出现的次数。测试代码如下:

class TestCountChars(unittest.TestCase):

    def test_count_chars(self):
        self.assertEqual(count_chars("hello"), {'h': 1, 'e': 1, 'l': 2, 'o': 1})
        self.assertEqual(count_chars(""), {})

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

实现函数:

def count_chars(s):
    char_count = {}
    for char in s:
        if char in char_count:
            char_count[char] += 1
        else:
            char_count[char] = 1
    return char_count

案例12:查找列表中的重复元素

编写一个函数 find_duplicates(lst) 来查找列表中的重复元素。测试代码如下:

class TestFindDuplicates(unittest.TestCase):

    def test_find_duplicates(self):
        self.assertEqual(find_duplicates([1, 2, 3, 2, 4, 3]), [2, 3])
        self.assertEqual(find_duplicates([1, 2, 3]), [])
        self.assertEqual(find_duplicates([]), [])

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

实现函数:

def find_duplicates(lst):
    from collections import Counter
    counts = Counter(lst)
    duplicates = [item for item, count in counts.items() if count > 1]
    return duplicates

案例13:计算两个日期之间的天数差

编写一个函数 days_between_dates(date1, date2) 来计算两个日期之间的天数差。测试代码如下:

from datetime import datetime

class TestDaysBetweenDates(unittest.TestCase):

    def test_days_between_dates(self):
        date1 = datetime(2023, 1, 1)
        date2 = datetime(2023, 1, 5)
        self.assertEqual(days_between_dates(date1, date2), 4)
        date3 = datetime(2023, 1, 10)
        self.assertEqual(days_between_dates(date2, date3), 5)

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

实现函数:

def days_between_dates(date1, date2):
    delta = abs((date2 - date1).days)
    return delta

案例14:文件内容统计

编写一个函数 count_lines_words_chars(filename) 来统计文件中的行数、单词数和字符数。测试代码如下:

class TestFileStats(unittest.TestCase):

    def test_count_lines_words_chars(self):
        filename = "test.txt"
        with open(filename, "w") as file:
            file.write("Hello World\n")
            file.write("This is a test.\n")
        lines, words, chars = count_lines_words_chars(filename)
        self.assertEqual(lines, 2)
        self.assertEqual(words, 6)
        self.assertEqual(chars, 25)

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

实现函数:

def count_lines_words_chars(filename):
    with open(filename, "r") as file:
        content = file.read()
        lines = content.count("\n") + 1
        words = len(content.split())
        chars = len(content)
    return lines, words, chars

实战案例:学生信息管理系统

假设我们要开发一个学生信息管理系统,该系统需要实现以下功能: 1. 添加学生信息。 2. 删除学生信息。 3. 查询学生信息。

我们先定义一个简单的数据模型 Student 和一个管理类 StudentManager

数据模型
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade

    def __repr__(self):
        return f"Student(name={self.name}, age={self.age}, grade={self.grade})"
管理类
class StudentManager:
    def __init__(self):
        self.students = []

    def add_student(self, student):
        self.students.append(student)

    def delete_student(self, name):
        self.students = [s for s in self.students if s.name != name]

    def find_student(self, name):
        for student in self.students:
            if student.name == name:
                return student
        return None
测试代码
import unittest

class TestStudentManager(unittest.TestCase):

    def setUp(self):
        self.manager = StudentManager()

    def test_add_student(self):
        student = Student("Alice", 20, "Sophomore")
        self.manager.add_student(student)
        self.assertIn(student, self.manager.students)

    def test_delete_student(self):
        student = Student("Bob", 22, "Junior")
        self.manager.add_student(student)
        self.manager.delete_student("Bob")
        self.assertNotIn(student, self.manager.students)

    def test_find_student(self):
        student = Student("Charlie", 21, "Senior")
        self.manager.add_student(student)
        found_student = self.manager.find_student("Charlie")
        self.assertEqual(found_student, student)

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

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、收藏吧!

文末福利

最后,如果你对Python感兴趣的话,可以试试我整理的这一份全套的Python学习资料,【点击这里】免费领取!

包括:Python激活码+安装包、Python
web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。

也可以微信扫描下方CSDN官方认证二维码免费获取【保证100%免费】。

① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值