”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Sheepy 在 Python 中进行单元测试

使用 Sheepy 在 Python 中进行单元测试

发布于2024-11-08
浏览:616

Unit testing in Python with sheepy

大家好,今天我来给大家介绍一个新的单元测试库,叫做sheepy,不过首先我们来说说单元测试的重要性。这个库不适合初学者,要使用它进行单元测试,您需要额外注意。它仅具有用于使用端点和 http 错误检查模块进行 API 测试的断言。

Github链接:github
PyPi 链接:pypi

生产中所有成熟、有自尊的软件都有单元测试,无论是为了了解代码中已有的内容是否仍然有效,为了防止之前已经报告和修复的错误,还是为了测试新功能,它很好地表明他们正在向前推进,并且没有积累技术债务。我们以火狐浏览器为例,每个目录下有一个tests子目录,针对已经报告的bug进行专门的测试,这样就保证了已经修复的bug不会再凭空出现,已经修复的bug就会出现又无处可去 这叫扔钱。随着时间的推移,您将失去时间、金钱、效率和市场份额,而竞争对手却比您做得更好,资源更少。

每个感觉自己无能为力的人都会试图诽谤那件事,单元测​​试也不例外。创建覆盖每个用例的更好的单元测试需要时间,就像生活中的一切一样,你的后端我怀疑你只阅读了一个教程并做出了完美的 api,对于你的前端来说也是如此,我怀疑你看了一门课程并来了使界面变得完美。所以不要认为单元测试会有什么不同!

断言方法

 ----------------------- ------------------------------------------------------- 
| Assertion Method       | Description                                           |
 ----------------------- ------------------------------------------------------- 
| assertEqual(a, b)      | Checks if two values are equal.                       |
| assertNotEqual(a, b)   | Checks if two values are not equal.                   |
| assertTrue(expr)       | Verifies that the expression is True.                 |
| assertFalse(expr)      | Verifies that the expression is False.                |
| assertRaises(exc, fn)  | Asserts that a function raises a specific exception.  |
| assertStatusCode(resp) | Verifies if the response has the expected status code.|
| assertJsonResponse(resp)| Confirms the response is in JSON format.             |
| assertResponseContains(resp, key) | Ensures the response contains a given key. |
 ----------------------- ------------------------------------------------------- 

安装

安装它非常简单,只需打开您选择的终端,安装 pip 并输入 pip install Sheepy

使用示例

from sheepy.sheeptest import SheepyTestCase

class ExampleTest(SheepyTestCase):
    def test_success(self):
        self.assertTrue(True)

    def test_failure(self):
        self.assertEqual(1, 2)

    def test_error(self):
        raise Exception("Forced error")

    @SheepyTestCase.skip("Reason to ignore")
    def test_skipped(self):
        pass

    @SheepyTestCase.expectedFailure
    def test_expected_failure(self):
        self.assertEqual(1, 2)

SheepyTestCase 类提供了用于创建和执行单元测试的多种功能,包括用于配置特殊行为(例如跳过测试或处理预期失败)的断言方法和机制。

在ExampleTest类中,定义了五个测试方法:

test_success:此测试检查传递给assertTrue方法的表达式是否为true。由于 True 值已显式传递,因此此测试将成功。

test_failure:此测试使用assertEqual方法检查两个值之间的相等性。然而,比较值1和2不同,导致测试失败。这演示了预期失败的情况,其中测试必须检测到不一致。

test_error:此方法会引发一个有目的的异常,并显示消息“强制错误”。目标是测试系统在处理测试执行期间发生的错误时的行为。由于该方法抛出异常而不对其进行处理,因此测试中将出现错误。

test_skipped:此测试已使用 SheepyTestCase 类的 Skip 方法进行修饰,这意味着在运行测试时将跳过该测试。跳过测试的原因被提供为“忽略的原因”,并且此理由可以显示在最终的测试报告中。

test_expected_failure:该方法使用expectedFailure装饰器,表示预计会发生失败。在方法内部,在 1 和 2 之间存在相等性检查,这通常会导致失败,但是随着装饰器的应用,框架认为这种失败是预期行为的一部分,不会被视为错误,但是作为“预期的失败”。

输出


测试结果:
ExampleTest.test_error:失败 - 强制错误
ExampleTest.test_expected_failure: 预期失败
ExampleTest.test_failure: FAIL - 1 != 2
ExampleTest.test_skipped: 跳过 -
ExampleTest.test_success: OK

API测试用例

Sheepy 测试框架中的 API 测试被设计得简单而强大,允许测试人员使用常见的 HTTP 方法(如 GET、POST、PUT 和 DELETE)与 API 进行交互。该框架提供了一个专用类 ApiRequests 来简化发送请求和处理响应,并通过 HttpError 异常类进行内置错误管理。

测试API时,测试类继承自SheepyTestCase,它配备了各种断言方法来验证API的行为。其中包括用于验证 HTTP 状态代码的assertStatusCode、用于确保响应采用 JSON 格式的assertJsonResponse 以及用于检查响应正文中是否存在特定键的assertResponseContains。

例如,该框架允许您向 API 发送 POST 请求,验证状态代码是否与预期值匹配,并断言 JSON 响应包含正确的数据。 API 请求通过 ApiRequests 类处理,该类负责构造和发送请求,而当服务器返回意外状态代码时,通过引发 HTTP 特定错误来简化错误处理。

通过提供内置断言和错误处理,该框架自动执行 API 测试中的大部分重复任务,确保编写测试的正确性和简单性。该系统可以让开发者专注于验证API行为和逻辑,成为保证API交互可靠性的有效工具。

from sheepy.sheeptest import SheepyTestCase  

class TestHttpBinApi(SheepyTestCase):
    def __init__(self):

        super().__init__(base_url="https://httpbin.org")

    def test_get_status(self):

        response = self.api.get("/status/200")
        self.assertStatusCode(response, 200)  

    def test_get_json(self):

        response = self.api.get("/json")
        self.assertStatusCode(response, 200)  
        self.assertJsonResponse(response)  
        self.assertResponseContains(response, "slideshow")  

    def test_post_data(self):

        payload = {"name": "SheepyTest", "framework": "unittest"}
        response = self.api.post("/post", json=payload)
        self.assertStatusCode(response, 200)  
        self.assertJsonResponse(response)  
        self.assertResponseContains(response, "json") 
        self.assertEqual(response.json()["json"], payload)  

    def test_put_data(self):

        payload = {"key": "value"}
        response = self.api.put("/put", json=payload)
        self.assertStatusCode(response, 200)  
        self.assertJsonResponse(response)  
        self.assertResponseContains(response, "json")  
        self.assertEqual(response.json()["json"], payload)  

    def test_delete_resource(self):

        response = self.api.delete("/delete")
        self.assertStatusCode(response, 200)  
        self.assertJsonResponse(response)  

输出示例

Test Results:
TestHttpBinApi.test_delete_resource: OK
TestHttpBinApi.test_get_json: OK
TestHttpBinApi.test_get_status: OK
TestHttpBinApi.test_post_data: OK
TestHttpBinApi.test_put_data: OK

概括:

新的sheepy库是一个令人难以置信的单元测试库,它有多种测试接入方法,其中包括一个仅用于API测试的模块,在我看来,它不是一个适合初学者的库,它需要面向对象编程的基础知识例如方法、类和继承。

版本声明 本文转载于:https://dev.to/brunociccarino/unit-testing-in-python-with-sheepy-b93?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何准备您的应用程序以处理黑色星期五的多个请求
    如何准备您的应用程序以处理黑色星期五的多个请求
    一年中最受欢迎的购物日之一是黑色星期五,此时商店的人流量经常急剧增加。如果您的应用程序尚未准备好应对这种激增,则可能会导致系统过载、响应时间缓慢甚至中断。以下是一些关键策略,可确保您的应用程序能够有效地管理更高的需求。 1。对您的应用程序进行负载测试 在黑色星期五高峰之前,进行负载测试以模拟高流量场...
    编程 发布于2024-11-08
  • C++ 中的“long”、“long int”、“long long”和“long long int”有什么区别?
    C++ 中的“long”、“long int”、“long long”和“long long int”有什么区别?
    了解 C 中长数据类型的细微差别 当您开始从 Java 过渡到 C 时,您可能遇到过多功能的long 数据类型,有多种形式,例如 long、long long、long int 和 long long int。本文旨在阐明这些数据类型之间的区别并阐明它们的预期用途。在 C 中,long 和 long...
    编程 发布于2024-11-08
  • 为什么你应该为开源付费
    为什么你应该为开源付费
    几乎每个开发者每天都会使用开源项目,无论是在 VS Code 中编写代码、使用 TailwindCSS 加速开发,还是使用最流行的 PHP 框架 Laravel 构建强大的 Web 应用程序。我们不要忘记用于创建管理面板的 FilamentPHP。 这些项目不是鬼建的;而是由鬼魂建造的。它们是由人们...
    编程 发布于2024-11-08
  • 如何查找一个数据帧中存在但另一个数据帧中不存在的行(比较 df1 和 df2)?
    如何查找一个数据帧中存在但另一个数据帧中不存在的行(比较 df1 和 df2)?
    比较数据帧:查找一个中存在但另一个中不存在的行比较数据帧以识别差异对于数据质量保证和合并至关重要运营。在本例中,我们有两个具有特定结构的数据帧(df1 和 df2),需要确定 df2 中存在但 df1 中不存在的行。最初,尝试使用 df1 != df2 比较数据帧,结果是一个错误。此方法仅适用于具有...
    编程 发布于2024-11-08
  • CSS 中的动画
    CSS 中的动画
    CSS中的动画有两部分 - @keyframes和animation-*。 @keyframes at 规则 第一部分要求我们定义@keyframes。 这让我们可以指定应在动画持续时间的不同点应用的 CSS 样式。 不同的时间点以百分比值指定。可以指定 0 到 100% 之间的任意...
    编程 发布于2024-11-08
  • 模拟数据生成器:高效软件测试的关键
    模拟数据生成器:高效软件测试的关键
    模拟数据生成在软件测试和开发中发挥着至关重要的作用,使团队能够在不依赖实时数据的情况下模拟真实场景。无论您是测试新功能还是开发 API,模拟数据都有助于简化流程,确保测试一致、可靠,而无需访问生产数据库。 在本文中,我们将深入探讨模拟数据生成器是什么、为什么它们很重要、如何实现它们以及当今开发人员...
    编程 发布于2024-11-08
  • 模拟请求
    模拟请求
    冷静一点,提交者王,我不会谈论 JSON-Server,但它值得留下来! 每个前端都会经历模拟端点请求的需要,有时是因为后端还没有完成其工作,有时是为了调试和模拟特定情况,这在日常生活中很常见。 是的,JSON-Server 令人难以置信并且使用起来非常简单,但是几天前我遇到了一个非常具体的问题,最...
    编程 发布于2024-11-08
  • 如何在 PHP 中迭代遍历和处理子目录内的文件?
    如何在 PHP 中迭代遍历和处理子目录内的文件?
    如何在PHP中遍历子目录并迭代处理文件在PHP中,遍历子目录并迭代处理文件可以使用RecursiveDirectoryIterator和RecursiveIteratorIterator来实现。让我们了解如何根据需要构建代码:// Initializing the path to the main ...
    编程 发布于2024-11-08
  • 瘾君子 # 何时使用效果、Angular DI 功能、请求缓存等
    瘾君子 # 何时使用效果、Angular DI 功能、请求缓存等
    ?嘿,Angular Addict 伙伴 这是 Angular Addicts Newsletter 的第 30 期,这是一本每月精选的引起我注意的 Angular 资源合集。 (这里是第29期、28期、27期) ?发布公告 ?Nx 19.8 更新 ...
    编程 发布于2024-11-08
  • 如何吸引顶尖 Python 开发人员到你的公司
    如何吸引顶尖 Python 开发人员到你的公司
    在竞争激烈的技术领域,吸引顶级 Python 开发人员对于任何希望利用这种多功能编程语言的力量的组织来说至关重要。随着 Python 继续在 Web 开发、数据科学和机器学习等领域占据主导地位,对熟练 Python 开发人员的需求空前高涨。如果您想聘请能够推动创新并为您的项目做出有意义贡献的 Pyt...
    编程 发布于2024-11-08
  • **JavaScript 中 `location = URL` 和 `location.href = URL` 有什么区别?**
    **JavaScript 中 `location = URL` 和 `location.href = URL` 有什么区别?**
    JavaScript:“location = URL”和“location.href = URL”的区别在 JavaScript 中,操作网页的 URL 可以通过以下方式实现两种类似的方法:直接设置 location 属性或设置 location.href 属性。虽然功能可能看起来相同,但这两种方法...
    编程 发布于2024-11-08
  • 如何有效地将PHP变量插入字符串?
    如何有效地将PHP变量插入字符串?
    将 PHP 变量插入字符串将 PHP 变量合并到字符串中时,注意语法以确保所需的输出是至关重要的获得。为了解决这个问题,让我们检查一下提示中显示的代码:目标是包含 $ width 变量在宽度样式属性中,并确保其后跟“px”。不幸的是,尝试用空格分隔变量和“px”或将它们连接在一起会导致错误。解决方案...
    编程 发布于2024-11-08
  • 了解 JavaScript 中下划线 (`_`) 的使用
    了解 JavaScript 中下划线 (`_`) 的使用
    在 JavaScript 中编码时,您可能会遇到用作变量名称的下划线字符 (_),特别是在函数参数中。虽然乍一看似乎很不寻常,但由于各种原因,这种做法在开发人员中很常见。在这篇博文中,我们将探讨下划线代表什么,为什么使用它,以及它在现实示例中的显示方式,例如 coalesceES6 函数。 ...
    编程 发布于2024-11-08
  • 像程序员一样思考:学习 C 基础知识
    像程序员一样思考:学习 C 基础知识
    以程序员思维学习 C 语言:基本语法:变量、数据类型、常量、运算符、控制流。实战案例:计算两个数的平均值,输入两个整数并计算其平均值。以程序员思维思考:用 C 语言学习基础引言学习编程并不难,尤其是当你以程序员思维思考时。本文将从基础开始,用 C 语言引导你逐步了解编程入门知识。C 语言基本语法变量...
    编程 发布于2024-11-08
  • Python 中的列表理解语法何时需要三元运算符?
    Python 中的列表理解语法何时需要三元运算符?
    列表理解难题:可迭代对象中的条件过滤在 Python 中,列表理解提供了一种基于现有可迭代对象创建列表的简洁方法。然而,出现了一个关于涉及 if 语句的列表理解的问题。目标是比较两个可迭代对象 a 和 b,并仅打印两者中出现的元素。预期的代码如下所示:print([y if y not in b f...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3