内容简介:我们继续上期的话题,单纯读取数据文件来做自动化是有诸多问题的。那么我们借助单元测试框架来做自动化就爽多了,因为它解决了测试中的几问题。被测功能还是上一篇的功能。
我们继续上期的话题,单纯读取数据文件来做自动化是有诸多问题的。那么我们借助单元测试框架来做自动化就爽多了,因为它解决了测试中的几问题。
-
如何定义一条测试用例,我们知道编程的世界里并没“用例”的概念。它只有目录、文件、类、方法、函数...,而单元测试框架告诉我们如何定义一条用例。
-
如何写断言,是的!当你做了一堆操作之后,如何判断这一系列操作是符合预期的,那么一定要拿实际结果与预期结果进行比较,而单元测试框架告诉我们如何写断言。
-
测试结果统计,当执行了一系列的用例之后,总共运行了多少条用例,成功了多少条,失败了多少条,失败的用例错误在哪里?单元测试框架会帮我们统计和展示。
被测功能还是上一篇的功能。
这里以unittest 单元测试框架为例。
import unittest from selenium import webdriver from time import sleep class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.url = "http://127.0.0.1:8000/" cls.driver.implicitly_wait(10) @classmethod def tearDownClass(cls): cls.driver.quit() def user_login(self, username, password): driver = self.driver driver.get(self.url) driver.find_element_by_id("inputUsername").send_keys(username) driver.find_element_by_id("inputPassword").send_keys(password) driver.find_element_by_id("Login").click() def atest_login_01(self): self.user_login("", '123') tips = self.driver.find_element_by_id("tips").text self.assertEqual(tips, '请输入帐号') def atest_login_02(self): self.user_login("user", "") tips = self.driver.find_element_by_id("tips").text self.assertEqual(tips, '请输入密码') def atest_login_03(self): self.user_login("error", "error") tips = self.driver.find_element_by_id("tips").text self.assertEqual(tips, '帐号或密码错误') def atest_login_04(self): self.user_login("admin", "admin123456") sleep(2) tips = self.driver.find_element_by_id("user").text self.assertEqual(tips, 'admin你好') if __name__ == '__main__': unittest.main()
看!测试代码是不是非常清晰。运行结果如下。
...F ====================================================================== FAIL: test_login_04 (__main__.LoginTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_login.py", line 43, in test_login_04 self.assertEqual(tips, 'admin你好') AssertionError: 'admin' != 'admin你好' - admin + admin你好 ? ++ ---------------------------------------------------------------------- Ran 4 tests in 12.977s FAILED (failures=1)
结果告诉我们运行了4条测试,1条失败了,失败的原因是test_login_04用例断言预期结果为“admin你好”,实际结果为“admin”。
可是,这没有用到读取数据文件啊?不是,数据驱动啊? 我以为这么规范的编写测试用例,要啥自行车。
其实,我已经尽量的把登录操作做了封装,每条用例里面只关心登录的数据和结果的断言。谁告诉你“数据驱动”就必须要“读取数据文件”的?
我们继续引入unitest的参数化。
import unittest from selenium import webdriver from time import sleep from parameterized import parameterized class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.url = "http://127.0.0.1:8000/" cls.driver.implicitly_wait(10) @classmethod def tearDownClass(cls): cls.driver.quit() def user_login(self, username, password): driver = self.driver driver.get(self.url) driver.find_element_by_id("inputUsername").send_keys(username) driver.find_element_by_id("inputPassword").send_keys(password) driver.find_element_by_id("Login").click() @parameterized.expand([ ("user_null", '', "123", "请输入帐号"), ("pawd_null", "user", '', "请输入密码"), ("login_error", "error", "error", "帐号或密码错误"), ("login_success", "admin", "admin123456", "admin你好"), ]) def test_login(self, name, username, password, assert_text): self.user_login(username, password) if name == "login_success": sleep(2) tips = self.driver.find_element_by_id("user").text self.assertEqual(tips, assert_text) else: tips = self.driver.find_element_by_id("tips").text self.assertEqual(tips, assert_text) if __name__ == '__main__': unittest.main(verbosity=2)
反正都是定义测试数据,这里提供了规范的元组给你用来定义数据,而且测试数据与测试方法上下呼应,维护起来也比读取文件方便多了,这次还要啥自行车?
测试结果:
test_login_0_user_null (__main__.LoginTest) ... ok test_login_1_pawd_null (__main__.LoginTest) ... ok test_login_2_login_error (__main__.LoginTest) ... ok test_login_3_login_success (__main__.LoginTest) ... FAIL ====================================================================== FAIL: test_login_3_login_success (__main__.LoginTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Python36\lib\site-packages\parameterized-0.6.1-py3.6.egg\parameterized\parameterized.py", line 392, in standalone_func return func(*(a + p.args), **p.kwargs) File "test_login.py", line 37, in test_login self.assertEqual(tips, assert_text) AssertionError: 'admin' != '请输入密码' - admin + 请输入密码 ---------------------------------------------------------------------- Ran 4 tests in 12.363s FAILED (failures=1)
测试结果依然清晰明白。
这个话题,本来到此就结束了,我其实是很鄙视读取数据文件的操作的,因为真get不到它的“方便”之处,做自动化测试写代码就老老实实的写代码,就你测试用的这点数据,真没必要读取文件,数据库就更谈不上了。但是,那么多人都在分享读取数据文件的demo(实际规模化之后就不得而知了),我也看了不少资料,找到一些勉强能接受的方法。
当然,这又是另一篇文章了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 架构视角 - DDD、TDD、MDD领域驱动、测试驱动还是模型驱动?
- 顶会论文应不应该提交代码?应该,但不能强制
- 事件驱动架构引领产业技术升级: 事件驱动联盟(中国)成立
- 领域驱动设计 (DDD) 实践之路(二):事件驱动与 CQRS
- 领域驱动设计 (DDD) 实践之路(二):事件驱动与 CQRS
- “性能驱动”转向“需求驱动” 中国引领全球超算技术路线
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX编程艺术
Eric S. Raymond / 姜宏、何源、蔡晓俊 / 电子工业出版社 / 2006-2 / 59.00元
本书主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为本书贡献了宝贵的内容。本书内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。一起来看看 《UNIX编程艺术》 这本书的介绍吧!