我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

doctest

简介: doctest 是 Python 自带的一个模块,可以嵌入到 Python 源码中,或者放到独立文件中进行测试。

  • 嵌入到 Python 源码中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding: utf-8 -*-

"""
这是一个测试案例
"""

<!--more -->

def multiply(a, b):
"""

Args:
a:
b:

Returns:

>>> mutiply(4, 3)
12
>>> mutiply(4, 3)
13

"""
return a * b

if __name__ == "__main__":
import doctest
# verbose 表示在执行测试的时候会输出详细信息, 包括成功案例 ,设为 False, 只输出失败案例
doctest.testmod(verbose=True)
  • 放到单独的文件中
1
2
3
4
5
6
# file_name test.txt
>>> from start import multiply
>>> multiply(3, 4)
12
>>> multiply(4, 3)
13

目前,这种测试方法,我用的比较多的地方是在写算法的时候,或者写一个比较简单的函数的时候,可以直接将 测试语句写到函数声明下面来验证函数的对错。

Pytest

目前较为流行的单元测试框架,上手容易。

  • 安装

    pip install pytest

  • 规则

    测试文件以 test_ 开头(或以 _test 结尾)

    测试类以 Test 开头,并且不能带有 __init__ 方法

    测试函数以 test_ 开头

    断言使用基本的 assert 即可

  • 使用方法

    作用域方面:

    fixture 的 scope 参数

    scope 参数有四种

    function: 每个 test 都运行,默认是 function 的 scope

    class: 每个 class 的所有 test 只运行一次

    module: 每个 module 的所有 test 只运行一次

    session: 每个 session 只运行一次

    执行前和执行后的操作

    setup 和 teardown 操作

    setup: 在测试函数或类之前执行,完成准备工作

    teardown,在测试函数或者类之后执行,完成收尾工作

    • 执行方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pytest # run all tests below current dir
    pytest test_mod.py # run tests in module file test_mod.py
    pytest somepath # run all tests below somepath like ./tests/
    pytest -k stringexpr # only run tests with names that match the
    # the "string expression", e.g. "MyClass and not method"
    # will select TestMyClass.test_something
    # but not TestMyClass.test_method_simple
    pytest test_mod.py::test_func # only run tests that match the "node ID",
    # e.g "test_mod.py::test_func" will be selected
    # only run test_func in test_mod.py
  • 其他用法

    通过@pytest.mark控制需要执行哪些feature的test,例如在执行test前增加修饰@pytest.mark.website

    执行的时候,可以通过 -m 执行所有标记的方法

    -m “website” 表示执行所有 website 标记的test方法

    -m “not website” 表示执行没有 website 标记的 test 方法

  • 代码实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # -*- coding: utf-8 -*-

    import pytest


    @pytest.fixture(scope='function')
    def setup_function(request):
    def teardown_function():
    print('teardown_function called.')

    print('setup_function called')


    @pytest.fixture(scope='module')
    def setup_module(request):
    print('setup_module called.')


    @pytest.mark.website
    def test_1(setup_function):
    print('Test_1 called.')


    def test_2(setup_module):
    print('Test_2 called.')


    def test_3(setup_module):
    print('Test_3 called.')
    assert 2 == 1 + 1

Unittest

在 Flask 项目中,使用的是 Flask 官方推荐的测试框架,其底层基于 Werkzeug,我们可以使用 Unittest 进行封装后,实现 GET、POST 方法进行模拟发送请求,进行测试。

这种测试方式,这种测试很方便, 但是也仅仅适用于对接口的测试。必要时候,还是需要使用 Jmeter 进行带有逻辑的测试。

单元测试方面,对于小型项目使用 Unittest 封装就可以在 view 层进行单元测试。

测试之 Protobuf

目前一般的web服务测试中,是使用 Json 对服务器进行请求,服务器也是通过 json 进行返回,Json 很容易读懂,这就对测试带来了极大的方便, 但是 Json 是纯字符,如果数据量较大,加上网络的延迟,就会使请求变得慢。 大家都知道,计算机 IO 的速度是很慢的,而 CPU 的速度是巨快的,就是因为要缩小 IO 和 CPU 之间的速度不协调问题,有了内存、一级缓存、二级缓存、三级缓存等等。

网络延迟我们无法控制,但是缩小传输数据的体积我们是可以做的,既然 CPU 快,那么我们就让它多干点活。

Protobuf 是Google旗下的一种数据传输格式,类似于 Json,但不同于json之处在于,它使用的是二进制进行传输,因为数据结构不一样,所以它的体积一般是比 Json 小的。在某些对延迟要求较高的系统上比较常用,如实时竞价系统。但是它的缺点就是人类无法看懂,需要进行解析成 Json 才可以方便我们查阅。

Protobuf 之 Python 解析

每次对接新的 adx 时,如果对方使用了 protobuf 来包装数据,即使我们手中拿到了原始的 json 数据,也不太容易在本地调试进行测试,因为我们的 rtb 服务器接收的是包装后的数据,所以我们需要手动将 json 转换为 protobuf 在进行发送。

我本身从事程序化广告这部分业务,我们这里有使用 Json 的,也有使用 Protobuf 进行传输的,这个系统较为复杂,每次测试的时候,要么自己在本地伪造投放数据,要么直接在测试服测试,而我本人倾向于直接在测试服测试,因为这样就不需要弄一些投放信息,就不需要牵扯 DMP 那块的业务,因为测试服上面都有。

阅读全文 »

关于学习的一些思考

有些操作也许永远都不会用,或者看到它的第一眼就觉得,这个用不上。

或者即使用得上也是做一些弱关联的工作,就是需要的时候就去解决,不需要就不去管它。

那天,我做完了升级某项功能的 API,代码提交了,并且通过了测试,代码在线上跑着,完全没有问题的样子。
而我觉得的问题,而是代码写的不太好的问题,恰好此时又不是下班时间,手中也
暂时没有其他什么事情,就准备 review 一下代码。

看着看着,觉得这里不好,那里冗余,想要精简一下,有时候突然发现,这一看就是 bug,改了改了。

为什么会有这种心理呢,我认真想了想,觉得,当时一边写代码,一遍调试,而当时,一旦出现bug,就在哪里补上一个几句代码,或者当时思维转的比较快,以至于我后面几乎没什么印象,或者看不懂当时为什么会这样做。

阅读全文 »

i2cssh

安装自己的 RUBY

最好不要用 Mac 自带的 ruby 进行安装,会提示无法写入错误,貌似苹果启用了保护功能,即使加上 sudo 也无法写入。

首先第一步: 不适用系统的 ruby ,使用自己安装的 ruby 。

brew install ruby

安装完后,注意页面上的提示告诉你执行下面的命令后,才可以更换成你安装的 ruby,否则还是系统默认的。

echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.zshrc

阅读全文 »

关于路由器

最近小米 AC2100 终于可以刷机了。就在前几天听说可以刷机了,立马就刷了老毛子系统。之前是使用 LEDE 软路由进行一些科学设置的,但是 LEDE 是安装在群辉虚拟机上,每次群辉出现一些异常bug的时候,就需要重启,随之网络也断了。在试用了 LEDE 软路由之后,发现其中一些软件已经没有人维护了,根本用不了,还有一些软件如 KOOLDNS, bug 不断,要不然就是不更新ip,要不然就是把ip解析到 127.0.0.1 。

基于小米 AC2100 可以刷机后, 果断放弃了 LEDE 。但是在 LEDE 上面,科学体验还是可以的,就是不支持自动故障切换节点功能,比如走 obfs 的节点,被封了后,每次只能手动上去更改混淆参数。

换了 老毛子 之后,发现自动故障切换节点功能是有了,但是基于它的设置界面及形式,搞得我晕头转向。最后不得不使用穷举法,一个一个试,看看哪一种参数可以成功访问 obfs。这里特别记录一下。

页面配置

在页面上建议,直接点击飞机,然后添加节点那里输入如下参数

-O origin -o plain --plugin obfs-local --plugin-opts "obfs=tls;obfs-host=www.bing.com"

阅读全文 »

网络唤醒(局域网唤醒)

在局域网中通过发送 魔法包来开机。

前提:

  1. 电脑主板支持局域网唤醒 wol

    2. 在操作系统设置好

一开始找了一些现有的帖子,都说群辉全洗白了就无法局域网唤醒了,因为 mac 变了,所以很多需要局域网唤醒的就办洗白来实现。

通过我的实测,发现不管是通过改过mac的那块网卡,还是另一块没有该过的,都是可以实现唤醒开机的。

阅读全文 »

测试!!!

本博客已支持自动部署

群晖SSH免密登录

在这里分享一下群晖开启ssh后,把公钥传输到机器上面,然后依旧无法免密登录的解决方法。

我的情况是这样的,很奇怪,在 iterm 中即使已经把公钥上传到群晖的家目录中的 .ssh 文件夹中了,但是还是会让我输入密码。然后如果此时保持有一个窗口已经登录服务器,第二个窗口就可以直接登录,不需要输入密码。这里并没有深究是iterm自带的功能,还是群晖服务器的问题。 反正第一次无法正常免密登录,那肯定可以判断是群晖的问题。

SSH 调试方法

  1. 在服务器上面开一个一次性的临时的ssh服务,这个服务职能被连接一次。端口随便设置个端口,不要与其他端口冲突就行,-d 开启debug 模式。

    which sshd 使用这个命令先查看 sshd 的绝对路径,我的是 /bin/sshd

    阅读全文 »

为什么要使用HTTPS

举一个例子,以前自己搭建的http网站,总是遇到js无法正确执行,并且页面里夹杂了本来没有的广告。问题出现在了运营商线路上,比如说我手机网络是移动的,然后用微信访问http绑定页面,偶尔就会出现移动查流量等等的广告。这是因为信息在传递的时候,走运营商网络,因为我的信息是http传递,没有加密,所以运营商在里面嵌入了广告修改后,再把信息传递给我的终端。

并且http本来就是不安全的,平时在家访问下http没什么事情,但是有时候还是需要在外面访问的,信息安全就得不到保证。

群晖GitLab HTTPS 设置

这里,演示一下群晖 GitLab 如何设置 HTTPS,其他服务也同理可以参考。

前言: 我有公网IP,并且路由器可以做端口转发。

先说下最终实现的功能:

阅读全文 »