unittest 编写 Web 自动化测试
我们学习 unittest 的目的是用它编写 Web 自动化测试用例,所以接下来会将 unittest 与Selenium 结合起来进行 Web 自动化测试。 创建 test_baidu.py 文件。 这里将百度首页的访问和搜索过程封装成一个 baidu_search()方法,并定义 search_key参数为搜索关键字,根据接收的关键字执行不同内容的搜索。这里的 baidu_search()方法会被当作测试用例执行吗?当然不会,因为根据 unittest 查找和执行测试用例的规则,它只会把以“test”开头的方法当作测试用例。 另一个值得讨论的问题是,测试用例的断言要不要写在封装的方法中?从前面的代码可以看出,测试的断言点是一样的。不过,笔者更倾向于把断言写在每一条测试用例里面,因为很多时候就算操作步骤是一样的,断言点也不完全一样。例如,登录功能的测试用例,虽然操作步骤相同,但是用户名为空和密码为空,这两条测试用例的提示信息可能显示在不同的位置,所以获取提示信息的定位方法是不一样的,因此断言也就不完全一样了。另外,从设计的角度来看,断言写在每一个测试用例中也会更加清晰。我们发现每一条测试用例都要启动和关闭一次浏览器,这是非常耗时的,那么如何减少浏览器的启动和关闭次数呢?利用前面学过的setUpClass/tearDownClass可以解决这个问题。# -*- coding:utf-8 -*- # filename: test_baidu.py # author: hello.yin # create time: 2021/11/16 17:31 import unittest from time import sleep from selenium import webdriver class BaiduTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Firefox() cls.base_url = "https://www.baidu.com" def baidu_search(self, search_key): self.driver.get(self.base_url) self.driver.find_element_by_id("kw").clear() self.driver.find_element_by_id("kw").send_keys(search_key) self.driver.find_element_by_id("su").click() sleep(2) def test_selenium(self): search_key = "selenium" self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + "_百度搜索") def test_unittest(self): search_key = "unittest" self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + "_百度搜索") @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == "__main__": unittest.main(verbosity=2)虽然我们将 driver 驱动定义为 cls.driver,但是在每个测试用例中使用时依然为self.driver。当整个测试类中的所有测试用例都运行完成后,会调用 cls.driver.quit()关闭浏览器。当一个测试类中有多条测试用例时,这种方式将大大缩短测试用例的执行时间。
执行结果:
Testing started at 17:48 ... C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe "C:\Program Files\JetBrains\PyCharm 2018.2\helpers\pycharm\_jb_unittest_runner.py" --path D:/00test/base_practice/practice/test_baidu.py Launching unittests with arguments python -m unittest D:/00test/base_practice/practice/test_baidu.py in D:\00test\base_practice\practice Ran 2 tests in 18.546s OK Process finished with exit code 0