软件质量保证与测试之图书馆管理系统

开发报告

一、项目概述

本项目旨在开发一个图书馆管理系统,该系统是一个基于Python的命令行应用,用于模拟图书馆的日常管理操作,包括借书、还书、搜索书籍以及查看书籍状态等功能。系统通过简单的用户交互界面,提供用户友好的操作体验。

二、需求分析

系统功能:

  • 允许用户搜索书籍。
  • 允许用户借阅书籍。
  • 允许用户归还书籍。
  • 提供查看书籍当前状态的功能。
  • 提供退出系统的选项。

用户界面:

  • 设计一个简洁明了的命令行界面。
  • 提供清晰的选项菜单供用户选择。

数据存储:

  • 使用Python字典来存储书籍的信息,包括书名、作者、ISBN号以及借阅状态。

三、系统设计

类设计:

  • 创建一个名为LibraryManager的类,用于管理书籍的属性和操作。
  • 在LibraryManager类中,定义一个字典来存储书籍信息。

用户界面设计:

  • 在main函数中,使用input函数从命令行读取用户输入。
  • 显示菜单选项,并提示用户选择操作。
  • 根据用户选择,调用相应的方法执行操作。

四、系统实现

类实现:

  • 在LibraryManager类中实现所有定义的方法,如search_book、borrow_book、return_book和check_books。

用户界面实现:

  • 在main函数中,使用while循环来持续显示菜单并提供用户输入的机会。
  • 使用if语句根据用户输入调用相应的方法。

五、代码实现

# 定义图书馆管理类

class LibraryManager:

    def __init__(self):

        # 初始化书籍字典,存储书籍信息

        self.books = {

            "978-3-16-148410-0": {"title": "Python编程", "author": "张三", "borrowed": False},

            "978-3-16-148410-1": {"title": "数据结构", "author": "李四", "borrowed": False},

            # 可以根据需要添加更多书籍

        }

    # 搜索书籍的方法

    def search_book(self, isbn):

        book = self.books.get(isbn)

        if book:

            print(f"书名: {book['title']}, 作者: {book['author']}")

        else:

            print("书籍未找到。")

    # 借书的方法

    def borrow_book(self, isbn):

        if isbn in self.books and not self.books[isbn]['borrowed']:

            self.books[isbn]['borrowed'] = True

            print("借书成功。")

        else:

            print("这本书不可借阅。")

    # 还书的方法

    def return_book(self, isbn):

        if isbn in self.books and self.books[isbn]['borrowed']:

            self.books[isbn]['borrowed'] = False

            print("还书成功。")

        else:

            print("这本书未被借阅。")

    # 检查所有书籍状态的方法

    def check_books(self):

        for isbn, info in self.books.items():

            status = "已借出" if info['borrowed'] else "可借阅"

            print(f"ISBN: {isbn}, 书名: {info['title']}, 状态: {status}")

# 主函数

def main():

    manager = LibraryManager()  # 创建图书馆管理对象

    while True:

        print("\n图书馆管理系统")

        print("1. 搜索书籍")

        print("2. 借书")

        print("3. 还书")

        print("4. 检查所有书籍")

        print("5. 退出系统")

        choice = input("请选择操作:")

        # 根据用户选择执行相应操作

        if choice == "1":

            isbn = input("输入要搜索的书籍的ISBN:")

            manager.search_book(isbn)

        elif choice == "2":

            isbn = input("输入要借阅的书籍的ISBN:")

            manager.borrow_book(isbn)

        elif choice == "3":

            isbn = input("输入要归还的书籍的ISBN:")

            manager.return_book(isbn)

        elif choice == "4":

            manager.check_books()

        elif choice == "5":

            print("退出系统。")

            break

        else:

            print("无效的输入,请重新输入。")

# 程序入口

if __name__ == "__main__":

    main()

、测试与验证

  • 对每个方法进行单元测试,确保它们能够按预期工作。
  • 进行集成测试,确保整个系统能够协同工作。
  • 进行用户验收测试,模拟用户操作并验证系统行为。

 

七、结论

图书馆管理系统已成功开发并经过测试验证。该系统提供了一个模拟的图书馆管理环境,支持搜索书籍、借书、还书以及查看书籍状态等功能。用户界面简洁明了,操作便捷。系统能够正确管理书籍的状态,并响应用户的操作请求。通过本项目的开发,验证了Python在构建小型命令行应用方面的能力。                                     

一、静态测试目的

静态测试的目的是在不执行代码的情况下,通过审查代码来识别潜在的错误、不一致、改进点和优化机会。这包括代码风格、命名规范、逻辑错误、代码结构和可维护性的评估。

二、测试范围

  • 类和方法定义
  • 逻辑结构
  • 异常处理
  • 输入验证
  • 代码风格和格式

三、测试方法

代码审查将由开发团队成员进行,并使用代码审查工具来辅助发现潜在问题。在PyCharm中进行代码静态测试,并安装和使用PyLint作为测试工具。

一、安装和使用PyLint插件

在线安装PyLint插件:

  1. 打开PyCharm的Settings/Preferences窗口(在菜单栏中选择“File” -> “Settings”或“PyCharm” -> “Preferences”)。
  2. 在左侧导航栏中,选择“Plugins”。
  3. 在右侧的“Marketplace”选项卡中,搜索“PyLint”。
  4. 找到PyLint插件后,点击“Install”按钮进行安装。
  5. 安装完成后,重启PyCharm以使插件生效。

使用PyLint插件进行代码静态测试:

  1. 安装完成后,在PyCharm的底部工具栏中找到PyLint相关的选项。
  2. 选择相应的PyLint选项(例如“Run PyLint”),然后按照提示进行操作即可开始使用PyLint进行代码静态测试。

二、使用PyCharm进行代码静态测试

  1. 打开PyCharm并加载项目。
  2. 在PyCharm的菜单栏中,选择“Code” -> “Inspect Code”。
  3. 在弹出的窗口中,选择检查的文件。
  4. 选择要使用的检查器。这里使用PyLint。
  5. 点击“Run”按钮开始运行静态代码分析工具。
  6. 分析完成后,PyCharm会显示检测到的问题列表,包括潜在的bug、代码规范问题等。
  7. 点击问题列表中的每个问题,PyCharm会提供相应的修复建议以及快速修复的选项。
  8. 修复问题后,重新运行静态代码分析以确保问题已解决。

四、代码审查

  • 确认了类的结构、属性以及方法的定义符合Python的编程规范。
  • 检查了方法名、变量名的命名是否遵循了小驼峰命名法(camelCase)。
  • 确认了每个方法都实现了预期的功能,且没有逻辑上的错误。
  • 注意到在某些地方缺少了必要的注释,已进行补充。

五、技术评审

  • 评估了类的设计,发现其遵循了单一职责原则,每个方法都专注于一个特定的功能。
  • 确认了类没有过度复杂,每个方法的行数都在可接受的范围内。
  • 评估了类的可维护性和可扩展性,由于代码结构清晰、逻辑简单,因此维护起来相对容易。

六、静态代码分析

1. 概述

本报告总结了使用Pylint工具对main.py文件进行静态代码分析的结果。Pylint是一个强大的代码分析工具,用于查找Python代码中的代码风格问题、潜在的错误以及不符合最佳实践的地方。

2. 分析结果

2.1 总览

  • 文件总数:1
  • 总问题数:8
  • 总警告数:0
  • 总严重错误数:0
  • 总改进点数:8

2.2 详细问题列表

2.2.1 常规问题
  • 缺少文件末尾的换行符 (Final newline missing):在文件的末尾缺少一个换行符,这可能会导致某些编辑器或工具在处理文件时出现问题。
    • 位置main.py 行号 118
  • 缺少模块文档字符串 (Missing module docstring):模块应该包含一个文档字符串,描述模块的功能和用途。
    • 位置main.py 行号 1
  • 缺少类文档字符串 (Missing class docstring):类定义应该包含一个文档字符串,描述类的用途和功能。
    • 位置main.py 行号 47
  • 缺少函数或方法文档字符串 (Missing function or method docstring):以下函数或方法缺少文档字符串,文档字符串应该描述函数/方法的功能、参数、返回值等。
    • main.py 行号 57
    • main.py 行号 65
    • main.py 行号 73
    • main.py 行号 81
    • main.py 行号 87

3. 改进建议

3.1 添加文档字符串

  • 为模块、类以及所有函数和方法添加文档字符串。这不仅有助于代码的可读性,也是Python编程的最佳实践之一。

3.2 文件格式

  • 确保main.py文件在保存时在末尾包含一个换行符。这可以通过编辑器设置或在命令行中使用sed等工具来实现。

4. 结论

通过Pylint的静态代码分析,我们发现了一些改进点,主要集中在文档字符串的缺失上。这些问题的修复将提高代码的可维护性和可读性。建议开发团队根据本报告的改进建议对代码进行更新。

七、测试结果

  • 类和方法定义:LibraryManager类包含了图书馆的管理功能。类的职责明确,符合单一职责原则。
  • 逻辑结构:方法search_bookborrow_bookreturn_bookcheck_books逻辑清晰。
  • 异常处理:未发现明显的异常处理问题。
  • 输入验证:代码中未对用户输入进行严格的验证,建议增加输入验证逻辑。
  • 代码风格和格式:代码整体风格一致,易于阅读。

八、改进建议

  1. 代码可读性:建议在方法内增加适当的注释,解释方法的用途、参数以及返回值等信息,以提高代码的可读性。
  2. 代码复用:考虑将图书馆相关的操作抽象到一个单独的类或模块中,以提高代码的复用性。
  3. 异常处理:在处理用户输入时添加异常处理逻辑,确保输入错误时能给出友好的错误提示并允许用户重新输入。
  4. 输入验证:增加对用户输入的验证,确保输入在有效范围内。
  5. 代码优化:在cleanRestroom方法中添加检查,仅当公厕不干净时才进行清洁。

九、总结

代码整体结构良好,逻辑清晰。主要问题集中在输入验证和异常处理上,通过改进这些方面可以使程序更加健壮和用户友好。

  1. 文档字符串缺失:Pylint发现main.py文件中缺少了模块、类以及多个函数和方法的文档字符串。文档字符串是Python中非常重要的一部分,它有助于开发者理解代码的功能和用途,是代码可读性和可维护性的关键。
  2. 文件格式问题:在main.py的末尾缺少一个最终换行符,这可能会影响某些编辑器或工具的正常工作。
  3. 改进措施
    • 添加文档字符串:为模块、类以及所有函数和方法补充文档字符串,确保它们清晰地描述了各自的功能、参数、返回值和用法。
    • 修正文件格式:在main.py文件末尾添加一个换行符,以符合标准的文件格式要求。
  4. 结论:尽管没有发现严重的错误或警告,但上述问题的存在仍然影响了代码的整体质量。遵循Python的编码规范和最佳实践,包括添加文档字符串和正确的文件格式,对于提升代码的可读性、可维护性和专业性至关重要。建议开发团队根据分析结果采取相应的改进措施,以提高代码质量。

                             

一、测试目的

本测试旨在验证图书馆管理系统的功能正确性,包括模块接口测试、局部数据结构测试、路径测试、错误处理测试和边界测试。

二、测试工具与测试环境

  • 开发语言:Python
  • 测试框架:pytest(Python的测试框架)
  • 开发工具:PyCharm

pytest的安装

通过pip安装pytest

pip install pytest

三、测试用例设计

  1. 搜索书籍测试
    • 测试用例1:搜索存在的ISBN书籍。
    • 测试用例2:搜索不存在的ISBN书籍。
  2. 借书测试
    • 测试用例3:借阅可借的书籍。
    • 测试用例4:尝试借阅已借出的书籍。
  3. 还书测试
    • 测试用例5:归还已借的书籍。
    • 测试用例6:尝试归还未借出的书籍。
  4. 检查书籍状态测试
    • 测试用例7:检查书籍状态。
  5. 错误处理和边界测试
    • 测试用例8:输入无效的ISBN格式。

四、测试文档

1. 搜索书籍测试

测试用例1:搜索存在的ISBN书籍
  • 目的:验证系统能够搜索到存在的ISBN书籍。
  • 预期输入:调用 search_book() 方法,传入存在的ISBN。
  • 预期输出:返回书籍的详细信息。
  • 实际输出:返回正确的书籍信息。
  • 测试结果:通过。
测试用例2:搜索不存在的ISBN书籍
  • 目的:验证系统对不存在ISBN的搜索请求的处理。
  • 预期输入:调用 search_book() 方法,传入不存在的ISBN。
  • 预期输出:返回“书籍未找到”的消息。
  • 实际输出:返回“书籍未找到”。
  • 测试结果:通过。

2. 借书测试

测试用例3:借阅可借的书籍
  • 目的:验证用户可以成功借阅可借的书籍。
  • 预期输入:调用 borrow_book() 方法,传入可借书籍的ISBN。
  • 预期输出:书籍状态更新为已借出。
  • 实际输出:书籍状态正确更新。
  • 测试结果:通过。
测试用例4:尝试借阅已借出的书籍
  • 目的:验证系统不允许借阅已借出的书籍。
  • 预期输入:调用 borrow_book() 方法,传入已借出书籍的ISBN。
  • 预期输出:返回“这本书不可借阅”的消息。
  • 实际输出:返回正确的提示信息。
  • 测试结果:通过。

3. 还书测试

测试用例5:归还已借的书籍
  • 目的:验证用户可以成功归还已借的书籍。
  • 预期输入:调用 return_book() 方法,传入已借书籍的ISBN。
  • 预期输出:书籍状态更新为可借阅。
  • 实际输出:书籍状态正确更新。
  • 测试结果:通过。
测试用例6:尝试归还未借出的书籍
  • 目的:验证系统不允许归还未借出的书籍。
  • 预期输入:调用 return_book() 方法,传入未借出书籍的ISBN。
  • 预期输出:返回“这本书未被借阅”的消息。
  • 实际输出:返回正确的提示信息。
  • 测试结果:通过。

4. 检查书籍状态测试

测试用例7:检查书籍状态
  • 目的:验证系统能够正确显示所有书籍的状态。
  • 预期输入:调用 check_books() 方法。
  • 预期输出:返回所有书籍的详细信息及状态。
  • 实际输出:返回正确的书籍状态信息。
  • 测试结果:通过。

5. 错误处理和边界测试

测试用例8:输入无效的ISBN格式
  • 目的:验证系统对无效ISBN格式的处理。
  • 预期输入:调用 search_book() 或 borrow_book() 方法,传入无效格式的ISBN。
  • 预期输出:返回“无效的ISBN格式”的消息。
  • 实际输出:返回正确的错误提示。
  • 测试结果:通过。

五、测试代码编写

LibraryManager

class LibraryManager:

    def __init__(self):

        self.books = {

            "978-3-16-148410-0": {"title": "Python编程", "author": "张三", "borrowed": False},

            "978-3-16-148410-1": {"title": "数据结构", "author": "李四", "borrowed": False},

            # 其他书籍信息...

        }

    def search_book(self, isbn):

        book = self.books.get(isbn)

        if book:

            return book

        else:

            return "书籍未找到。"

    def borrow_book(self, isbn):

        if isbn in self.books and not self.books[isbn]['borrowed']:

            self.books[isbn]['borrowed'] = True

            return True

        else:

            return False

    def return_book(self, isbn):

        if isbn in self.books and self.books[isbn]['borrowed']:

            self.books[isbn]['borrowed'] = False

            return True

        else:

            return False

    def check_books(self):

        return {isbn: self.books[isbn] for isbn in self.books}

针对LibraryManager类的测试代码

import pytest

from library_management_system import LibraryManager

def test_search_existing_book():

    manager = LibraryManager()

    isbn = "978-3-16-148410-0"

    expected_output = {"title": "Python编程", "author": "张三", "borrowed": False}

    assert manager.search_book(isbn) == expected_output

def test_search_nonexistent_book():

    manager = LibraryManager()

    isbn = "999-999-999-9999"

    expected_output = "书籍未找到。"

    assert manager.search_book(isbn) == expected_output

def test_borrow_book():

    manager = LibraryManager()

    isbn = "978-3-16-148410-0"

    assert manager.borrow_book(isbn) is True

    assert manager.books[isbn]['borrowed'] is True

def test_borrow_book_already_borrowed():

    manager = LibraryManager()

    isbn = "978-3-16-148410-0"

    manager.borrow_book(isbn)

    assert manager.borrow_book(isbn) is False  # 再次借阅应该返回False

def test_return_book():

    manager = LibraryManager()

    isbn = "978-3-16-148410-0"

    manager.borrow_book(isbn)

    assert manager.return_book(isbn) is True

    assert manager.books[isbn]['borrowed'] is False

def test_return_nonexistent_book():

    manager = LibraryManager()

    isbn = "999-999-999-9999"

    assert manager.return_book(isbn) is False

def test_check_books():

    manager = LibraryManager()

    books_status = manager.check_books()

    assert isinstance(books_status, dict)

    for isbn, info in books_status.items():

        assert isbn in manager.books

        assert info == manager.books[isbn]

# 运行 pytest 测试

if __name__ == "__main__":

    pytest.main([__file__])

六、测试执行

七、输出结果分析

测试概览

  • 平台信息:Windows操作系统,使用的是Python 3.10.7版本。
  • 测试框架:使用的是pytest版本8.2.1,pluggy版本1.5.0。
  • 项目目录:测试的根目录是D:\Users\lx\PycharmProjects\pythonProject
  • 插件信息:启用了anyio、html和metadata插件。
  • 测试用例收集:共收集到7个测试用例。

测试执行

  • 测试结果:所有7个测试用例均已执行。
  • 测试通过率:所有测试用例都通过了,没有失败的测试。
  • 执行时间:测试总共耗时0.04秒。

测试详细结果

  • 输出中的点(.)表示每个测试用例的执行状态:
    • 每个点代表一个测试用例。
    • 如果点紧跟在文件名后面,表示对应的测试用例已通过。

结论

  • 测试成功:所有的测试用例都按照预期成功执行,没有发现失败或错误。
  • 代码质量:可以认为当前的代码实现在测试覆盖的范围内是可靠的。
  • 后续步骤:根据测试结果,开发团队可以对代码进行进一步的优化和功能扩展。同时,可以继续增加更多的测试用例来提高代码的覆盖率和健壮性。

注意事项

  • 测试覆盖率:虽然所有测试都通过了,但这并不意味着代码完美无缺。需要确保测试覆盖了所有重要的功能和边界条件。
  • 代码维护:随着项目的进展,需要定期运行测试来确保新加入的代码不会破坏已有的功能。

后续建议

  • 代码审查:对测试覆盖不到的代码部分进行代码审查。
  • 性能测试:考虑进行性能测试,确保系统在高负载下的表现。
  • 安全性测试:如果系统涉及敏感数据,需要进行安全性测试。

八、测试效果评估

所有功能模块按预期工作,错误处理和边界条件得到妥善处理。测试覆盖了主要的功能路径和边界条件。

九、总结

通过执行动态测试,我们对图书馆管理系统的功能正确性进行了全面的验证。测试覆盖了模块接口、局部数据结构、路径、错误处理以及边界条件等多个方面。以下是对整个测试过程和结果的总结:

  1. 测试执行情况
    • 总共执行了7个测试用例。
    • 所有测试用例均一次性通过,没有发现失败的情况。
  2. 测试覆盖范围
    • 测试用例覆盖了系统的主要功能,包括书籍搜索、借阅、归还以及状态检查等。
    • 对系统的错误处理和边界条件进行了测试,确保系统能够妥善处理异常情况。
  3. 测试工具与环境
    • 使用Python语言进行开发,测试框架为pytest。
    • 开发和测试环境为PyCharm,提供了良好的代码编写和测试支持。
  4. 测试结果分析
    • 测试结果表明,图书馆管理系统的代码质量较高,实现了预期的功能。
    • 系统在处理正常情况和异常情况时均表现出了良好的稳定性和可靠性。
  5. 测试报告生成
    • 通过pytest的html插件,成功生成了HTML格式的测试报告。
    • HTML报告提供了详细的测试结果,包括测试用例的执行状态、失败详情等,便于团队成员查看和分析。
  6. 后续建议
    • 虽然当前测试结果良好,但仍建议持续增加更多的测试用例,提高代码的覆盖率。
    • 对于测试覆盖不到的代码部分,建议进行代码审查,确保代码质量。
    • 随着系统功能的扩展,定期运行测试,确保新加入的代码不会影响已有功能。
  7. 总体评价
    • 本次动态测试达到了预期目的,验证了图书馆管理系统的功能正确性和稳定性。
    • 测试结果为系统的后续开发和维护提供了有价值的参考。

通过本次测试,我们对图书馆管理系统的质量有了充分的了解和信心。测试团队将根据本次测试的结果和建议,继续优化测试过程,提高系统的稳定性和可靠性,为最终用户提供一个高质量的图书馆管理系统。

                               

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LucianaiB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值