Selenium+Python:也说HTTPTestRunner无法产生测试报告

1.      环境

操作系统

Win10

IDE

PyCharm Community 2018.1

Eclipse (Oxygen 4.7)+ PyDev 5.9.2 (JDK1.8)

Python

3.5

Selenium

selenium-3.9.0-py2.py3-none-any.whl

FirefoxDriver

0.20.0

Firefox浏览器

59.0.2(32位)

ChromeDriver

2.34

Chrome浏览器

63.0.3239.84

  

2.      PyCharm+版本1:无法生成报告

    还是虫师书里的一个例子,不知道是不是因为环境的原因,在PyCharm中运行后一直没有生成测试报告。

#coding=utf-8

import time
import unittest
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner

class Baidu(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.base_url = "https://www.baidu.com/"

    def test_baidu_search(self):
        driver = self.driver
        self.driver.implicitly_wait(10)
        driver.get(self.base_url)
        driver.find_element_by_id("kw").send_keys("HTMLTestRunner")
        driver.find_element_by_id("su").click()

    def tearDown(self):
        time.sleep(5)
        self.driver.quit()

if __name__ == '__main__':
    testunit = unittest.TestSuite()
    testunit.addTest(Baidu("test_baidu_search"))

    fp = open(r".\result.html", "wb")
    runner = HTMLTestRunner(stream=fp,title="百度搜索测试报告",description="用例执行情况")
    runner.run(testunit)
    fp.close()

    由于是第一次用PyCharm,而运行也没有报错信息,完全不知道是什么原因没有生成报告,因此咨询了一个朋友,正好他前两天也一直在搞测试报告。他问我是怎么运行的,我说是在Project窗口中的test_baidu.py上点击右键,选择【Run 'Unittestsin test_baidu.py'】,因为在右键菜单里面找不到其他的Run项。

    朋友说,这就是问题的所在,因为运行的是Unittests in test_baidu.py而不是test_baidu.py,让我点击代码窗口右上角的下拉框中的【Edit Configurations】

打开【Run/Debug Configurations】对话框 

把【Unittests in test_baidu.py】,然后再运行就好了。 

    但我删除后,该下拉框就只有【Edit Configurations】

而右键test_baidu.py,还是【Run 'Unittestsin test_baidu.py'】。这时候我突然发现在【if __name__ =='__main__': 】这行代码的旁边有个绿色的右向箭头,右键之有【Run 'test_baidu.py'】

但是点击了,还是没有生成测试报告,并且右上角的那个下拉框又和之前一样,是Unittests in test_baidu.py,说明运行的还是Unittest in test_baidu.py。

  

3.      PyCharm+版本2:生成报告

    朋友让我试试把fp = open(r".\result.html", "wb")放到if __name__ =='__main__':外面,这样确实能生成result.html,但是0KB,空的。我似乎隐约明白了,是因为运行Unittests in test_baidu.py根本就不会执行if __name__ == '__main__':中的语句。可要怎么才能选择运行test_baidu.py呢?! 

    朋友又查看了一下我的代码,认为是可能是addTest()的问题,他用的是testunit.addTest(unittest.makeSuite(类名)),而我用的是testunit.addTest(类名("测试函数名")),并建议我把测试类Baidu提取出来,test_baidu.py中单纯的建测试集并运行。修改以后的代码是这样的:

import time
import unittest
from selenium import webdriver

class Baidu(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.base_url = "https://www.baidu.com/"

    def test_baidu_search(self):
        driver = self.driver
        self.driver.implicitly_wait(10)
        driver.get(self.base_url)
        driver.find_element_by_id("kw").send_keys("HTMLTestRunner")
        driver.find_element_by_id("su").click()

    def tearDown(self):
        time.sleep(5)
        self.driver.quit()

import unittest
from HTMLTestRunner import HTMLTestRunner
from Baidu import Baidu

if __name__ == '__main__':
    testunit = unittest.TestSuite()
    testunit.addTest(unittest.makeSuite(Baidu))

    fp = open(r".\result.html", "wb")
    runner = HTMLTestRunner(stream=fp,title="百度搜索测试报告",description="用例执行情况")
    runner.run(testunit)
    fp.close()

    这样无论是右键test_baidu.py,还是右键if语句旁边的绿色箭头,都可以选择【Run 'test_baidu.py'】了,并且运行之后能正常生成报告。并且其实和addTest()无关,改回原来的testunit.addTest(Baidu("test_baidu_search"))一样可以。

    那真的只有这样组织代码,才能直接运行test_baidu.py吗?

 

4.      发现【Run】-【Run…】

    就在我以为真的只能象版本2那样组织代码,才能选择到直接运行模式的时候,看到主菜单中有个【Run】,其子菜单中有个【Run…】,点击该菜单项,弹出的【Run】对话框中显示有两种运行模式。

点击【1.test_baidu】即可以直接运行test_baidu.py,即使将代码改回到版本1,也同样可以。

 

5.      Eclipse

    之前一直用的IDE是Eclipse,那Eclipse里面是否也存在这个问题呢?

    试验了一下,在Eclipse中右键项目窗口中代码文件,【Run As】有两个子菜单项,其中【Python Run】即为直接运行模式,而【Python unit-test】是unittest运行模式。

 

6.     总结

  • PyCharm中有两种运行导入了unittest模块的Python代码的模式:一种是直接运行模式,即Run '文件名.py',另一种则是unittest运行模式,即Run 'Unittests in 文件名.py'
  • 当用unittest运行模式运行代码时,相当于是代码被unittest引用了,因此不会执行if __name__ == '__main__':中的代码
  • 在Project窗口中右键代码文件只能选择unittest运行模式,而在Project窗口选中代码文件后,点击【Run】-【Run…】可以选择两种模式中的任何一种
  • Eclipse中也有这两种运行模式,分别为【PythonRun】和【Python unit-test】
  • 能不能生成报告其实和代码没有关系,版本1和版本2只是代码组织的方式存在差异,当然应该推荐版本2的组织方式,将测试用例和测试集分开,更清晰更有条理
  • 不能生成报告是因为unittest运行模式下,不能执行到if__name__ == '__main__':中的生成报告代码

  

7.      参考文献

[1]  《Selenium2自动化测试实战:基于Python语言》虫师编著 电子工业出版社 2016年1月

[2]  selenium使用HTMLTestRunner成功报告 https://blog.csdn.net/qq_34897661/article/details/79812089

[3]  pycharm run unittest和单个运行  https://blog.csdn.net/zhanin123/article/details/78931582

[4]  Python中if __name__=="__main__:"的作用 https://www.cnblogs.com/arkenstone/p/5727885.html




©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值