gtest测试框架使用详解_Selenium自动化测试之Unittest单元测试框架的使用!

55fa109d3a7beca9dfb88ca0cabf8da4.gif

aa56dc45b5655356db4e70e45e438daf.png 什么是unittest

这里我们将要用的unittest是python的单元测试框架,当我们写的用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护,而unittest正是这样一款工具。我们这里用一个示例来展示用unittest脚本是什么样子的

 1 # -*- coding: utf-8 -*-

 2 from selenium import webdriver

 3 from selenium.webdriver.common.by import By

 4 from selenium.webdriver.common.keys import Keys

 5 from selenium.webdriver.support.ui import Select

 6 from selenium.common.exceptions import NoSuchElementException

 7 from selenium.common.exceptions import NoAlertPresentException

 8 #导入unittest包

 9 import unittest, time, re

10 

11 #SearchTest类继承自unittest.TestCase,表明这是一个测试案例

12 class SearchTest(unittest.TestCase):

13     #setUp用于初始化工作

14     def setUp(self):

15         self.driver = webdriver.Firefox()

16         self.driver.implicitly_wait(30)

17         self.base_url = "https://www.baidu.com/"

18         self.verificationErrors = []

19         self.accept_next_alert = True

20 

21     #以test开头的是我们的测试脚本    

22     def test_search(self):

23         driver = self.driver

24         driver.get(self.base_url + "/")

25         driver.find_element_by_id("kw").click()

26         driver.find_element_by_id("kw").clear()

27         driver.find_element_by_id("kw").send_keys("selenium2")

28         driver.find_element_by_id("su").click()

29 

30     def is_element_present(self, how, what):

31         try: self.driver.find_element(by=how, value=what)

32         except NoSuchElementException as e: return False

33         return True

34 

35     def is_alert_present(self):

36         try: self.driver.switch_to_alert()

37         except NoAlertPresentException as e: return False

38         return True

39 

40     def close_alert_and_get_its_text(self):

41         try:

42             alert = self.driver.switch_to_alert()

43             alert_text = alert.text

44             if self.accept_next_alert:

45                 alert.accept()

46             else:

47                 alert.dismiss()

48             return alert_text

49         finally: self.accept_next_alert = True

50 

51     #在每个测试方法后执行,完成清理工作

52     def tearDown(self):

53         self.driver.quit()

54         self.assertEqual([], self.verificationErrors)

55 

56 #整个测试过程集中在unittest的main()模块中,其默认执行以test开头的方法

57 if __name__ == "__main__":

58     unittest.main()

通过这个我们大概对unittest有个直观的了解了。unittest.main():使用它可以将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

aa56dc45b5655356db4e70e45e438daf.png unittest中的概念

TestCase

一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown。unittest.TestCase类,所有测试用例类继承的基本类。此类提供了很多assert方法用于检查比较,部分如下:

a92ac1dd61741f2b798485644d574be0.png bf624e983d9220b2ab28f6e57bb92516.png

多数方法都可以见其名知其意,使用的门槛很低。

TestSuite

对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中。

TextTestRunner

是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中。

TestFixture

测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。

知道了这几个主要的概念,我们就可以把上面的脚本中的最后一行unittest.main(),改为以下代码:

1  #构造测试套件

2     suite = unittest.TestSuite()

3     suite.addTest(SearchTest("test_search"))

4     #执行测试

5     runner = unittest.TextTestRunner()

6     runner.run(suite)

执行之后发现和之前用unittest.main()的结果一样。 aa56dc45b5655356db4e70e45e438daf.png 用例组织

这里我们假设,脚本当中有多个TestCase如test_case1,test_case2…,那我们应该怎样去控制它们的执行顺序呢?

执行测试用例方案一

直接用

unittest.main()

执行,这里它搜索所有以test开头的测试用例方法,按照ASCII的顺序执行多个用例。

执行测试用例方案二

先实例化测试套件,将用例加载进去,再用TextTestRunner去执行用例:

1  suite=unittest.TestSuite()

2  suite.addTest(Test('test_case2'))

3  suite.addTest(Test('test_case1'))

4  runner=unittest.TextTestRunner()

5  runner.run(suite)

执行的顺序是用例的加载顺序,比如这里是先执行2后执行1。

执行测试用例方案三

在方案2中,如果我们有成百上千个用例的话,一个一个add进去,是不太现实的,那么我们可以用defaultTestLoader来加载:

1     test_dir = './'

2     discover = unittest.defaultTestLoader.discover(test_dir, pattern='*test.py')

3     runner = unittest.TextTestRunner()

4     runner.run(discover)

这里用./指定了当前目录,指定了*test.py文件,对其当中的用例进行执行,顺序和方案一相同。

如果这里指定的目录下面有多个经pattern匹配上的.py文件呢?调用discover方法,首先通过test_dir定义查找目录,如果文件名满足定义的pattern,那么我们要用for循环来找出所有被筛选出来的用例,并将其循环加到套件中,主要代码如下:

1  for test_suite in discover:

2         for test_case in test_suite:

3             test_unit.addTests(test_case)

由上面组织用例的方式我们可以知道,在实际的测试用脚本开发中,我们可以在目录下创建xx.py的文件,当用例稳定运行后,可以修改成test_xx.py,以便于添加到测试套件中。注意,文件名的匹配规则,我们可以随便由pattern参数定义。

如果要执行多级目录结构的用例呢?要想被discover读取执行,我们要在目录下加_ init _.py文件

一个例子

下面简单的介绍一个用unittest组织的用例结构,先建立D:\Test_Project目录,下面放上test_case和test_report来分别存放用例和报告。

编写测试用例

在test_case下面编写用例,如下简单的示范了在百度上搜索关键字和点击设置的操作:

1 文件名为:test_baidu.py

2

3 # -*- coding: utf-8 -*-

4 from selenium import webdriver

5 import unittest, time, re

6

7 class MyTest(unittest.TestCase):

8

9     def setUp(self):

10         self.driver = webdriver.Firefox()

11         self.driver.implicitly_wait(30)

12         self.base_url = "https://www.baidu.com"

13         self.accept_next_alert = True

14

15     def test_02baidu_search(self):

16         u''' 测试百度搜索'''

17         driver = self.driver

18         driver.get(self.base_url + "/")

19         driver.find_element_by_id("kw").click()

20         driver.find_element_by_id("kw").clear()

21         driver.find_element_by_id("kw").send_keys("selenium-test")

22         driver.find_element_by_id("su").click()

23         print("test_baidu__test_02baidu_search")

24

25     def test_01baidu_setting(self):

26         u''' 测试百度首页设置 '''

27         driver = self.driver

28         driver.get(self.base_url + "/")

29         driver.find_element_by_css_selector("div#u1 a.pf").click()

30         driver.find_element_by_class_name("setpref").click()

31         driver.find_element_by_css_selector("div#gxszButton>a.prefpanelgo").click()

32         driver.switch_to_alert().accept()

33         print("test_baidu__test_01baidu_setting")

34

35     def tearDown(self):

36         self.driver.close()

37

38 #从all_test中调用时,可以不要这个

39 if __name__ == "__main__":

40     unittest.main()

为了显示出组织测试用例的效果,我们将此文件再复制一份,把文件名和方法名等修改一下:

1 文件名为:test_baidu2.py

2

3 # -*- coding: utf-8 -*-

4 from selenium import webdriver

5 import unittest, time, re

6

7 class MyTest(unittest.TestCase):

8     u''' 测试baidu的第二个用例'''

9     def setUp(self):

10         self.driver = webdriver.Firefox()

11         self.driver.implicitly_wait(30)

12         self.base_url = "https://www.baidu.com"

13         self.accept_next_alert = True

14

15     def test_02baidu_search(self):

16         u''' 测试baidu的第二个用例的test_02baidu_search'''

17         driver = self.driver

18         driver.get(self.base_url + "/")

19         driver.find_element_by_id("kw").click()

20         driver.find_element_by_id("kw").clear()

21         driver.find_element_by_id("kw").send_keys("selenium-test")

22         driver.find_element_by_id("su").click()

23         print("test_baidu2__test_02baidu_search")

24

25

26     def test_01baidu_setting(self):

27         u''' 测试baidu的第二个用例的test_01baidu_setting'''

28         driver = self.driver

29         driver.get(self.base_url + "/")

30         driver.find_element_by_css_selector("div#u1 a.pf").click()

31         driver.find_element_by_class_name("setpref").click()                        driver.find_element_by_css_selector("div#gxszButton>a.prefpanelgo").click()

32         driver.switch_to_alert().accept()

33         print("test_baidu2__test_01baidu_setting")

34

35     def tearDown(self):

36         self.driver.close()

37

38 if __name__ == "__main__":

39     unittest.main()

美化报告样式和发送结果邮件

上面我们写了 两个测试用例作为示例,我们也可以添加更多的进去。接着我们使用HTMLTestRunner这个开源模块来美化测试报告,关于它的下载使用可以参考https://pypi.python.org/pypi/HTMLTestRunner。然后,我们可以在代码中写上运行完成之后自动发送测试邮件出来,便于我们查看。请参看以下代码:

1 #coding=utf-8

2 import unittest

3 import smtplib

4 from email.mime.text import MIMEText

5 from email.header import Header

6 import time

7 import HTMLTestRunner

8 from email.mime.application import MIMEApplication

9

10 #---发送邮件---

11 def send_email(report_file):

12     sender = "XXXXXX@qq.com"

13     receiver = "XXXXXX@qq.com"

14     smtpserver = "smtp.qq.com"

15     #发送邮箱的账号密码,此处使用的是qq邮箱和第三方登录的授权码

16     username = "XXXXXX@qq.com"

17     password = "gfomcomojtuudijc"

18

19     #定义邮件正文

20     file = open(report_file,"rb")

21     mail_body = file.read()

22     file.close()

23

24     msg = MIMEText(mail_body, _subtype="html", _charset="utf-8")

25     msg["Subject"] = u"自动化测试报告"

26

27     smtp = smtplib.SMTP_SSL("smtp.qq.com")

28     smtp.login(username, password)

29     smtp.sendmail(sender, receiver, msg.as_string())

30     smtp.quit()

31     print("Email has send out !")

32

33 #---将用例添加到测试套件---

34 def creatsuite():

35     testunit=unittest.TestSuite()

36     test_dir = "D:\\Test_Project\\test_case"

37     discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py",

38                                                  top_level_dir = None)

39     for test_suite in discover:

40         for test_case in test_suite:

41             testunit.addTest(test_case)

42             print (testunit)

43     return testunit

44

45 if __name__ == "__main__":

46     current_time = time.strftime("%Y-%m-%d-%H-%M")

47     report_dir = "D:\\Test_Project\\test_report\\"

48     report_file = report_dir + current_time + "-Test_Result.html"

49     report_stream = open(report_file, "wb")

50     # runner = unittest.TextTestRunner()

51     # 注意HTMLTestRunner只支持python2

52     runner = HTMLTestRunner.HTMLTestRunner(stream=report_stream,title=u"自动化测试报告",  description=u"用例执行情况如下:")

53     runner.run(creatsuite())

54     report_stream.close()

55     send_email(report_file)

在上面的代码中我们使用了runner = HTMLTestRunner.HTMLTestRunner()方法来代替runner = unittest.TextTestRunner(),是为了使用HTMLTestRunner这个模块来美化和输出美观的报告。然后调用方法来发送邮件。运行此文件后,可以得到以下输出的报告:

a7373ed83268ecfef74475c789ecf031.png

可以看见使用这个可以清晰的看到用例的执行情况, 也便于查看失败用例的原因去调试它,同时在们输入的收件箱也会收到一份通知邮件,我们可以将此输出报告添加到正文或附件中,以便于查看。

760ab09082d4a85783e8753367ff6349.png

832aa588b54d42b42258c8bcf599229f.gif

原文链接:

https://www.cnblogs.com/linuxchao/p/linuxchao-unittest.html

本文为51Testing经授权转载,转载文章所包含的文字来源于作者。如因内容或版权等问题,请联系51Testing进行删除。

推荐阅读

点击阅读☞自动化测试必备技能之Selenium表格定位!

点击阅读☞Python Selenium项目实战之添加发送HTML测试报告邮件!

点击阅读☞您如何使用Selenium来计算自动化测试的投资回报率?

点击阅读☞什么是Selenium Webdriver中的显式等待与隐式等待?

点击阅读☞五分钟学会用Selenium抓取拉钩网动态数据!

2423f956fa044f8728dda5d64d4d1cb6.gif

38b4e9267026e8e60ed8bdd510adc46e.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GTest是Google Test的简称,是一个功能强大的C++单元测试框架。它提供了丰富的断言和测试工具,可以方便地编、运行和管理测试用例。 首先,我们需要下载并安装GTest框架GTest可以从官方网站下载并编译安装,也可以使用包管理工具进行安装。安装完成后,我们就可以在自己的项目中使用GTest进行单元测试了。 在编测试用例时,我们需要在一个类中定义多个测试函数。每个测试函数都应该以"TEST"宏开始,并且应该在测试函数中使用多个断言来验证被测试代码的行为。例如,我们可以使用"EXPECT_EQ"断言来验证两个值是否相等。当测试函数执行完毕时,我们可以使用"ASSERT_"宏来检查测试是否通过。 GTest还提供了一些高级功能,例如测试夹具(Test Fixture)和参数化测试(Parameterized Test)等。测试夹具可以帮助我们在测试函数之前和之后执行一些共享的设置和清理操作。参数化测试可以使得我们在一组测试数据上运行相同的测试代码,以验证被测试代码在不同输入条件下的行为。 在运行测试时,我们可以使用GTest提供的命令行工具来执行测试用例。它会输出每个测试函数的执行结果以及总体的测试统计信息。我们也可以在IDE中集成GTest,并通过点击运行按钮来执行测试。 总之,GTest是一个非常强大和方便的单元测试框架,可以帮助我们编高质量的测试用例并验证被测试代码的正确性。通过充分利用GTest提供的功能,我们可以玩转Google单元测试框架,提升软件开发的质量和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值