背景知识,某次使用HTMLTestRunner的时候,发现一直都无法导出报告,后来查询资料发现了一些坑,现在整理一下来龙去脉。
一:pycharm默认的是pytest框架去执行unittest框架的测试用例
![a818360e7f31484e557306a0f914c254.png](https://img-blog.csdnimg.cn/img_convert/a818360e7f31484e557306a0f914c254.png)
如上的代码,如果第一次执行,是不会打印任何数据的,最终输出框的代码如下:
![5be5bf2af8f2de35156fae9ac0e1b97c.png](https://img-blog.csdnimg.cn/img_convert/5be5bf2af8f2de35156fae9ac0e1b97c.png)
通过以上信息,正常打印了,但是通过pytest-3.3.1这个框架去执行的测试用例
现在我们添加3行代码,添加main函数试试
![b6dc81711b1c9f299560793ee44fa986.png](https://img-blog.csdnimg.cn/img_convert/b6dc81711b1c9f299560793ee44fa986.png)
如上代码,我们点击main函数这一行去执行脚本,执行过程如下
![64b8044591956ad75aa80eddb0b0a5ae.png](https://img-blog.csdnimg.cn/img_convert/64b8044591956ad75aa80eddb0b0a5ae.png)
最终我们会发现,结果和第一个步骤是一样的,由此我们得出结论:
(1)使用pytest测试框架时候,不需要main()函数,系统可以自动识别测试用例并执行。
(2)即使包含main()函数,点击它去执行,也不会去执行main()函数。
(3)具体是使用哪个测试框架执行,不是通过main()函数设置的,在别的地方。
而此时,pycharm右上角的执行框如下所示:
![248150df34947508a1c9c96af68976b8.png](https://img-blog.csdnimg.cn/img_convert/248150df34947508a1c9c96af68976b8.png)
二:python运行脚本的三种模式
通过查阅资料才发现,原来python的运行脚本的方式有多种:
- 例如普通模式运行,不会自动去加载测试用例执行
- unittest 测试框架运行模式,可以自动去发现testcase并执行
- pytest 测试框架运行模式,就是我们上面2个步骤都是使用pytest测试框架运行的
- 重要原则:第一次按照何种模式执行测试用例,后续都会按照这种方式去执行
因为如上2步,我们都是按照pytest模式去执行的,即使添加的main()函数,最终默认的执行方式都是pytest模式。
三:如何修改脚本运行的模式呢?
方法一:修改pycharm默认的测试框架
具体步骤如下:
![c5c440a528e92ebfc45a122a2a8f876f.png](https://img-blog.csdnimg.cn/img_convert/c5c440a528e92ebfc45a122a2a8f876f.png)
(1)这种方式修改完之后,如果某个文件是第一次运行,那默认执行的测试框架是系统默认的框架
(2)如果某个文件已经通过其他模式运行了,即使更改了系统默认测试框架,也还是按照第一次运行的模式去执行。
方法二:设置运动脚本时候的默认框架
入口一:菜单栏Run—->Run—->Edit Configuration
![6f633f6d746b075f9115eefd7085778a.png](https://img-blog.csdnimg.cn/img_convert/6f633f6d746b075f9115eefd7085778a.png)
![5853aa329ca4235ff4a40dc288e83abc.png](https://img-blog.csdnimg.cn/img_convert/5853aa329ca4235ff4a40dc288e83abc.png)
入口二:右上角运行按钮旁边—>Edit Configurations
![b36616586dfe0564685041c470552e97.png](https://img-blog.csdnimg.cn/img_convert/b36616586dfe0564685041c470552e97.png)
通过以上2种入口,进入设置页面如下所示:
![1eedcba1ef0636ea44052f9301a6faa7.png](https://img-blog.csdnimg.cn/img_convert/1eedcba1ef0636ea44052f9301a6faa7.png)
上图中,左边的方框运行的内容在Python tests栏目下面,说明脚本已经使用pytest测试框架运行了,但我们系统TestCase是通过Unittest框架运行的
我们需要添加unittest框架的运行模式去运行脚本,具体步骤如下:
![1f7b3c7fbb9726473bfe0c0007961f64.png](https://img-blog.csdnimg.cn/img_convert/1f7b3c7fbb9726473bfe0c0007961f64.png)
![5a664bdb7b58deca84178aa273d37d51.png](https://img-blog.csdnimg.cn/img_convert/5a664bdb7b58deca84178aa273d37d51.png)
最终效果如下:
![39e7242c6eabd3884d7defb40aa040e2.png](https://img-blog.csdnimg.cn/img_convert/39e7242c6eabd3884d7defb40aa040e2.png)
此时,我们再去执行脚本(点击main()运行或者点击右上角按钮运行结果是一样的)
![ae6d300891dd31e8bafae42a294ad018.png](https://img-blog.csdnimg.cn/img_convert/ae6d300891dd31e8bafae42a294ad018.png)
结果如下:
![8c5fea101ac1d790b56f3a6d88352b71.png](https://img-blog.csdnimg.cn/img_convert/8c5fea101ac1d790b56f3a6d88352b71.png)
- 如上的结果说明调用的unittest框架去执行,但是没有调用main()函数。
- 如果单纯为了执行测试用例,不用写main()函数也可以
四:main()函数有啥作用,难道就没点价值吗?
场景一:执行单个测试用例(删除下图右上角脚本运行的记录了)
![d01d7ef8d0c5c8d04239bc29efd00779.png](https://img-blog.csdnimg.cn/img_convert/d01d7ef8d0c5c8d04239bc29efd00779.png)
![d01d7ef8d0c5c8d04239bc29efd00779.png](https://img-blog.csdnimg.cn/img_convert/d01d7ef8d0c5c8d04239bc29efd00779.png)
结果如下:
![fb00d8a7033139e8abb150c8073d7979.png](https://img-blog.csdnimg.cn/img_convert/fb00d8a7033139e8abb150c8073d7979.png)
说明只执行了一个测试用例,test_2_run
场景二:执行所有测试用例(删除下图右上角脚本运行的记录了)
最终结果如下:
![013b4a7f951c0e227bfca910cbd55024.png](https://img-blog.csdnimg.cn/img_convert/013b4a7f951c0e227bfca910cbd55024.png)
执行所有测试用例的方法:
其实只要不点击单个测试用例的定义函数的行,无论点击哪一行,即使点击main()函数一行,或者空白行,都可以执行所有测试用例
如果代码比较多的情况加,我们又想尽快执行所有的测试用例,点击main()函数可以执行所以的测试用例,不会出错,目前能想到的就这些……
五:普通模式运行测试用例(删除下图右上角脚本运行的记录了)
![e318dbd0321bd7bfa93d145d41b50118.png](https://img-blog.csdnimg.cn/img_convert/e318dbd0321bd7bfa93d145d41b50118.png)
![4899c4ef0f248c63c96571a972c1733a.png](https://img-blog.csdnimg.cn/img_convert/4899c4ef0f248c63c96571a972c1733a.png)
结果:
![edca0c63c497ba1f3fa38e875b1e8ca3.png](https://img-blog.csdnimg.cn/img_convert/edca0c63c497ba1f3fa38e875b1e8ca3.png)
使用普通模式运行,系统会运行main()函数里面所有的函数,包括非TestCase的函数,当main()函数中有测试报告的需要导出的时候,需要使用普通模式运行。
使用pytest或unittest测试框架,在main函数中只执行TestCase函数,其他函数不执行。
六:普通运行模式,导出测试报告
![f458b1f55bd568e948b9c2a3ef8bc4d1.png](https://img-blog.csdnimg.cn/img_convert/f458b1f55bd568e948b9c2a3ef8bc4d1.png)
默认是使用unittest模式运行的,结果如下,其实这样不会执行main()函数,更不会导出报告
![da8cba0f960afbde8511c81b77555dcb.png](https://img-blog.csdnimg.cn/img_convert/da8cba0f960afbde8511c81b77555dcb.png)
最终通过创建普通模式的运行模式,然后按照如下方式可以运行
![dcc2fe7e48ede689ded88e81c42e65d1.png](https://img-blog.csdnimg.cn/img_convert/dcc2fe7e48ede689ded88e81c42e65d1.png)
最终测试报告如下:
![e0854a5c1457264e72c6d391f1aca4b5.png](https://img-blog.csdnimg.cn/img_convert/e0854a5c1457264e72c6d391f1aca4b5.png)
转自:pycharm中脚本执行的3种模式(unittest框架、pytest框架、普通模式) - hyx20160514 - 侵删