引言
测试驱动开发(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漫画教程,手机也能学习