资讯专栏INFORMATION COLUMN

代码测试用例指南

chinafgj / 2950人阅读

摘要:测试的通用规则测试单元应该集中于小部分的功能,并且证明它是对的。通过去除依赖尽量使测试单元快速运行。实现来持续集成通过代码提交的本地或者来持续集成测试你的代码。

原文链接:http://blog.speedx.com/backend-test-guide

将测试代码和运行代码一起写是一种非常好的习惯。聪明地使用这种方法将会帮助你更加精确地定义代码的含义,并且代码的耦合性更低。

测试的通用规则:

测试单元应该集中于小部分的功能,并且证明它是对的。

每个测试单元应该完全独立。

通过Mock去除依赖

尽量使测试单元快速运行。

实现钩子来持续集成

我们通过一个简单的python程序及unittest作为示例来为大家介绍如何进行测试,这里推荐大家使用python3来运行示例。

我们先创建一个将会使用的测试目录

mkdir /tmp/TestHookTest
cd /tmp/TestHookTest
测试单元应该集中于小部分的功能,并且证明它是对的

下图为unittest包中包含的断言

我们现在来写一个通过用户名获得github信息的一个函数,并对这个函数进行测试

# test.py
import unittest
import json

import requests

def fetch_github_profile(username):
    response = requests.get("https://api.github.com/users/" + username)
    return response.json()

class SaveDataTest(unittest.TestCase):

    def test_fetch_github_profile(self):
        username = "ZhangBohan"
        data = fetch_github_profile("ZhangBohan")
        self.assertEqual(data["login"], username)

通过python3 -m unittest test运行

每个测试单元应该完全独立

每个都能够多带带运行,除了调用的命令,都需在测试套件中。要想实现这个规则,测试单元应该加载最新的数据集,之后再做一些清理。

如果有数据库依赖,在每次测试前创建测试数据库,结束后销毁该数据库,测试应该有多带带的数据库,不要在生产和开发环境测试,避免数据变化引起的测试失败

通过Mock去除依赖

假设我们现在想把取得的用户数据保存到本地,并测试是否正确保存

# test.py
import unittest
import json

import requests

def fetch_github_profile(username):
    response = requests.get("https://api.github.com/users/" + username)
    return response.json()

def save_data(data):
    with open("data.json", "w") as f:
        f.write(json.dumps(data))

class SaveDataTest(unittest.TestCase):

    def test_fetch_github_profile(self):
        username = "ZhangBohan"
        data = fetch_github_profile("ZhangBohan")
        self.assertEqual(data["login"], username)

    def test_save_data(self):
        data = fetch_github_profile("ZhangBohan")
        save_data(data)

        with open("data.json") as f:
            file_data = json.loads(f.read())
            self.assertIsNotNone(file_data)
            self.assertEqual(data["id"], file_data["id"])

在这个测试中我们的test_save_data中的data依赖fetch_github_profile中的返回数据,现实情况中会遇到更为复杂的依赖,为了一个测试用例,我们可能需要构建大量的初始化数据。我们可以通过mock来解除这个依赖,让test_save_data专注于测试保存数据部分

# test.py
import unittest
import json
from unittest.mock import MagicMock

import requests

def fetch_github_profile(username):
    response = requests.get("https://api.github.com/users/" + username)
    return response.json()

def save_data(data):
    with open("data.json", "w") as f:
        f.write(json.dumps(data))


FAKE_PROFILE_DATA = {
  "login": "ZhangBohan",
  "id": 2317407
}

class SaveDataTest(unittest.TestCase):

    def test_fetch_github_profile(self):
        username = "ZhangBohan"
        data = fetch_github_profile("ZhangBohan")
        self.assertEqual(data["login"], username)

    def test_save_data(self):
        fetch_github_profile = MagicMock(return_value=FAKE_PROFILE_DATA)
        data = fetch_github_profile("ZhangBohan")
        save_data(data)

        with open("data.json") as f:
            file_data = json.loads(f.read())
            self.assertIsNotNone(file_data)
            self.assertEqual(data["id"], file_data["id"])
尽量使测试单元快速运行

如果一个多带带的测试单元需要较长的时间去运行,开发进度将会延迟,测试单元将不能如期常态性运行。有时候,因为测试单元需要复杂的数据结构,并且当它运行时每次都要加载,所以其运行时间较长。把运行吃力的测试单元放在多带带的测试组件中,并且按照需要运行其它测试单元。

实现hook来持续集成

通过代码提交的本地hook或者webhook来持续集成测试你的代码。

举个git本地hook的例子(这可假设你了解git hook的工作原理)。

> git init
> vim .git/hooks/pre-commit

.git/hooks/pre-commit文件中写入

#!/bin/sh

cd /tmp/TestHookTest && python3 -m unittest test

执行:

> chmod +x .git/hooks/pre-commit

> git add test.py
> git commit -m "test hook"
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
[master (root-commit) b390117] test hook
 1 file changed, 9 insertions(+)
 create mode 100644 test.py

在远程代码仓库部署的webhook能更好的测试全部代码。

Python指南-测试你的代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38439.html

相关文章

  • 100天涨薪4k!从功能测试到自动化测试,我整理的超全学习指南

    摘要:事实上,自动化测试是相对于手动的。减少人为的错误自动化测试是机器完成,不存在执行过程中人为的疏忽和错误,测试设计完全决定了测试的质量,可以降低减少人为造成的错误。而接口自动化测试,主要是对接口进行测试。 今年6月份,由于经济压力让我下定决心进阶自动化测试,已经24的我做了3年功能测试,坐标广...

    TwIStOy 评论0 收藏0
  • 无头浏览器测试可视化:Laravel Dusk 控制台入门指南

    摘要:通过添加此功能,该程序包将启用记录请求和响应信息所需的功能。是一条普通控制器路由,用于输出控制台的视图。收集浏览器行为这是整个扩展包最乏味的部分。 Laravel Dusk 控制台是一款 Laravel 扩展包,能够为你的 Dusk 测试套件提供漂亮的可视面板。通过它,你可以可视化运行 Dusk 测试时涉及的各个步骤,以及查看每个步骤的 DOM 快照。这对于调试浏览器测试、并搞清楚后台...

    levius 评论0 收藏0
  • Maven_00

    摘要:例如,可以提供更改日志用源码管理工具生成交叉引用邮件列表依赖清单单元测试报告含覆盖率提供开发过程的最佳实践指南通过收集现行的开发最佳实践,来指导用构建的项目。 本文大约1026个字,阅读时间4分钟。 主要介绍了Maven名字的由来、Maven产生的背景和Maven的主要功能。 问题:Maven是啥? 大多数人都用Maven来管理Java项目的依赖,这个应该是Maven的主要功能没跑了,...

    booster 评论0 收藏0
  • 录制回放模式创建测试用例 - Katalon Studio

    摘要:的这个功能支持录制测试用例,并可在多种浏览器中回放。允许用户对所捕获的对象选择定位模式。这样做有助于重用及维护对象。步骤打开并点击主工具栏上的首个测试用例按键。步骤记录下来的对象和动作会象以下显示的那样保存到测试用例中。 对于自动化测试菜鸟来说,开始学习自动化最简单的方法是测试录制。识别应用系统上的对象是一件费时且痛苦的事情。Web Recorder Utility(网页录制功能) 捕...

    姘搁『 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<