测试目录
项目的整体结构可以参考“软件目录开发规范”,这里单说测试目录。一般都是在项目里单独创建一个测试目录,目录名就是“tests”。
关于目录的位置,一种建议是,在项目名(假设项目名是Foo)的一级子目录下创建二级子目录 “Foo/foo/tests” 。但是这样可能是因为用起来不方便,有很多是按下面的做法。不过下面的示例我还是用这个方法来创建测试目录。
还可以把测试目录向上移一层,作为一级子目录,直接创建在项目之下 “Foo/tests”。参考django、scrapy、flask都是这样的做法。
测试函数
标题的意思是对函数(def)进行测试,相对于测试类(class)。
学习测试,得有要测试的代码。下面是一个简单的函数,接收城市名和国家名,返回一个格式为“City, Country“这样的字符串:
# UnitTest/unit_test/utils/city_functions.pydef get_city_info(city, country): city_info = "%s, %s" % (city, country) return city_info.title()
接下来就对上面的这个函数进行测试。
手动测试
现在来写一个使用这个函数的程序:
# UnitTest/unit_test/test/cities.pytry: from unit_test.utils.city_functions import get_city_infoexcept ModuleNotFoundError: import sys sys.path.append('../..') from unit_test.utils.city_functions import get_city_infoprint("Enter 'q' at any time to quit.")while True: city = input("city name: ") if city == 'q': break country = input("country name: ") if country == 'q': break fullname = get_city_info(city, country) print("/tcity info:", fullname)
然后运行的结果:
Enter 'q' at any time to quit.
city name: shanghai
country name: china
city info: Shanghai, China
city name: qProcess finished with exit code 0
上面这样是手动测试,还是得有一种自动测试函数输出的高效方式。如果能够对get_fullname()进行自动测试,就能始终确信,给这个函数提供测试过的姓名后,它能返回正确的结果。尤其是在对函数进行修改的前后。
模块导入路径的问题
PyCharm会自动把项目目录加到环境变量里去,在PyCharm里执行都没问题。但是如果不用PyCharm而是单独运行,这个目录结构应该会有点问题,会找不到需要测试的函数。简单点就是把测试用例和被测试的函数放到同一个目录里,然后改一下 from import 就可以正常运行了。或者自己手动添加环境变量,就像例子里那样。
单元测试-unittest
Python标准库中的模块unittest提供了代码测试工具。
创建测试用例
为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。
新闻热点
疑难解答