在这篇文章开始阅读之前,需要准备如下:
- git
- python 2/3
- virtualenv
要求用git 是为了面对最现实的日常工作环境,python2/3 兼容,python 的virtualenv 是实现python 语言开发SelfTestCode 开发环境配置的核心工具。
事情是这样的,在阅读很多从github 上面clone下来的项目里面,如flask,eventlet。在/tests 下面有不少写得很不错的testcase,所以想要按照这种规范来布置项目。
git clone https://github.com/pallets/flask.git
可是遇到了一些问题,比方说:
- testcase 需要install package 才能跑起来;
- 安装之后的code 都被拷贝进了lib/site-packages下面,而不是在repo下面的code。如果想改代码,就得移步到site-packages下面改;
- 就算改完了,如果想要git add, git commit也还要把code 拷贝回repo下面;
或者换个套路:
在test case的code 都中加入:
sys.path.append("/path/to/git_repo")
这是其实是一种很朴实的walk through,只是无法面对repo 移动位置之后需要做调整的命运,而且丑。用python的人应该都有种意识,感觉到这种实践方法不够完备。
我其实只是想要:
- 在repo中能够一边改code , 一边改test case,同时也能用test case测项目的code;
- 除了test case中没有多余的部分,何况看flask,eventlet中, test case 中的import 都是直接import项目,没有多余的部分:
import pytest
from flask import Markup
from flask.json.tag import TaggedJSONSerializer, JSONTag
直到有一天,在pip 文档中发现了下面的这段命令:
(venv) >>> pip install -e . #project in current directory
这里的.指的是repo文件夹的根目录,里面有setup.py 文件,来与上面这个命令对应。
#!/usr/bin/env python
import os
from setuptools import setup, find_packages
setup(
name = "Project_name",
version = '0.1',
description = "",
long_description = "",
author = "",
url="",
packages=find_packages(exclude=['test', 'test.*']),
install_requires=[],
)
这会在site-packages 文件夹中生成一个链接,对应的就是repo的目录。这样,virtualenv 就认为这个repo 下的lib文件已经被安装了,也将这个目录导入sys.path中,不需要额外在代码中添加多余的部分。
然后就可以按照大批开源项目的tests 文件夹的结构构件我们的Self Test Code了,对应我们项目的结构分别对各个单元写对应的测试。
关于Self Test Code 这个主题,在此展开对应的Martin Fowler的博客文章
以下个人观点。打一个比方,开发如果是走路的话,迈左脚是写代码,迈右脚就是做测试。只写功能不做测试,或者做不完整的测试,就好比单脚跳走路或者坡脚走路,不会健康。
对于其他编程语言,也可以寻求类似模式。