首页 > 编程知识 正文

python自动化测试用哪个软件,如何搭建pythonselenium环境

时间:2023-05-04 16:07:14 阅读:196411 作者:1073

PART 3: 使用 Unittest编写测试单元(WebDriver + unittest)

1. Unittest

unittest单元测试框架:

一般也称为PyUnit,是从Java程序开发中广泛应用的JUnit启发而来的;我们可以使用unittest为任何项目创建全面的测试套件;

unittest使我们具备创建测试用例、测试套件、测试夹具的能力;

unittest组件:

1)Test Fixture(测试夹具):

使用测试夹具,可以定义在单个或多个测试执行之前的准备工作和测试执行之后的清理工作;

2)Test Case(测试用例):

unittest中执行测试的最小单元,通过验证unittest提供的assert方法来验证一组特定的操作和输入以后得到的响应;

unittest提供了一个名为TestCase的基础类,可以用来创建测试用例;

3)Test Suit(测试套件):

一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行;

4)Test Runner(测试执行器):

测试执行器负责测试执行调度并且生成测试结果给用户;

测试执行器可以使用图形界面、文本界面或者特定的返回值来展示测试执行结果;

5)Test Report(测试报告):

测试报告展示所有执行用例的成功或者失败状态的汇总;包括失败的测试步骤的预期结果和实际结果,还有整体运行状况和运行时间的汇总; 
原文链接:https://blog.csdn.net/酷炫的金毛_hua/article/details/80571109

一般测试分为3个部分,一个初始化前置条件,一个执行功能操作,一个断言用来校验实际结果与预期结果是否一致。

2. 用一个Test case类实现一个简单的测试用例

2.1 新建一个Python unit file

2.2 把下面的code复制到文件里面。

# -*- coding:utf-8 -*-import unittestfrom selenium import webdriverclass SearchTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.implicitly_wait(15) self.driver.maximize_window() self.driver.get('http://www.baidu.com') def test_search_by_category1(self): self.search_field = self.driver.find_element_by_id("kw") self.search_field.clear() self.search_field.send_keys('selenium2') self.search_field.submit() products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]") self.assertEqual(10, len(products)) def test_search_by_category2(self): self.search_field = self.driver.find_element_by_id("kw") self.search_field.clear() self.search_field.send_keys('selenium2') self.search_field.submit() products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]") self.assertEqual(10, len(products)) def tearDown(self): self.driver.quit()if __name__ == '__main__': unittest.main(verbosity=2)

在test_search_by_category1用例下面可以加上test_search_by_category2,跑起来就是执行两个 case.

断言:unittest的TestCase类提供了很多实用的方法来校验预期结果和实际结果是否一致;

assertEqual(a, b [, msg]); assertNotEqual(a, b [, msg]);

assertTrue(x [, msg]); assertFalse(x [, msg]);

assertIsNot(a, b [, msg]);

assertRaises(exc, fun, *args, **kwds);

......
 

3. 用TestSuite组件一组测试

应用unittest的TestSuites特性,可以将不同的测试组成一个逻辑组,然后设置统一的测试套件,并通过一个命令来执行;具体通过TestSuites、TestLoader和TestRunner类来实现的;

将上个脚本重命名为TestCase1.py, 再新建一个脚本TestCase2.py.

# -*- coding:utf-8 -*-import unittestfrom selenium import webdriverfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.webdriver.common.by import Byclass SearchTestHomePage(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Firefox() cls.driver.implicitly_wait(15) cls.driver.maximize_window() cls.driver.get('http://www.baidu.com') def test_search_by_category(self): self.assertTrue(self.is_element_present(By.ID, "kw")) def test_search_by_category1(self): self.search_field = self.driver.find_element_by_id("kw") self.search_field.clear() self.search_field.send_keys('selenium') self.search_field.submit() products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]") self.assertEqual(10, len(products)) @classmethod def tearDownClass(cls): cls.driver.quit() def is_element_present(self, how, what): """""" try: self.driver.find_element(by=how, value=what) except NoSuchElementException as e: return False return Trueif __name__ == '__main__': unittest.main(verbosity=2)

新建一个TestSuite.py file如下

# -*- coding:utf-8 -*-import unittestfrom TestCase1 import SearchTestfrom TestCase2 import SearchTestHomePagesearch_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest)search_test_homepage = unittest.TestLoader().loadTestsFromTestCase(SearchTestHomePage)smoke_tests = unittest.TestSuite([search_test, search_test_homepage])unittest.TextTestRunner(verbosity=2).run(smoke_tests)

查看运行结果:

也可以看个别case fail 的原因

4. 扩展生成HTML格式的测试报告

要生成一个所有测试的执行结果作为报告发给同组的其他人员;因此我们需要一个格式更加友好的测试报告,既能够查看测试结果,又能深入各个细节;我们可以使用unittest的扩展HTMLTestRunner来实现。

4.1 修改TestSuite file的code如下:

# -*- coding:utf-8 -*-import unittestimport HTMLTestRunnerimport osfrom TestCase1 import SearchTestfrom TestCase2 import SearchTestHomePagefrom datetime import datenow = date.today()datestr = now.strftime('%m-%d-%y')dir = os.getcwd()search_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest)search_test_homepage = unittest.TestLoader().loadTestsFromTestCase(SearchTestHomePage)smoke_tests = unittest.TestSuite([search_test, search_test_homepage])filepath = dir + "/SmokeTestReport{}.html".format(datestr)with open(filepath, 'wb') as outfile: runner = HTMLTestRunner.HTMLTestRunner(stream=outfile, title='Title: Test Report', description='Des:Smoke Tests') runner.run(smoke_tests)#unittest.TextTestRunner(verbosity=2).run(smoke_tests)

但是会发现无法Install HTMLTestRunner,以至于无法import这个类

4.2 通过以下方法可以实现。

install HTMLTestRunner in python 3 

1) 从下面网址下载HTMLTestRunner.py, 并把这个file放在工程下面,或者自己建一个HTMLTestRunner.py文件,把代码拷贝进去

         http://tungwaiyip.info/software/HTMLTestRunner.html

2) 可以import HTMLTestRunner之后运行还是会遇到下面的问题,修改以下地方即可

问题1:No module named StringIO原因:python 3 中 没有 StringIO 这个模块。这里我们需要使用io 这个模块来代替。解决方法:第94行引入的名称要改,从 import StringIO 改成import io。相应的,539行 self.outputBuffer = StringIO.StringIO() 要改成self.outputBuffer = io.BytesIO()问题2:AttributeError: 'dict' object has no attribute 'has_key'原因:python 3 字典类型的object 已经不支持 has_key函数,我们需要使用in 来进行遍历。解决方法:定位到642行,if not rmap.has_key(cls): 需要换成 if not cls in rmap:问题3:'str' object has no attribute 'decode'原因:python3 里面对字符的操作中,decode已经拿掉了。解决方法:定位到772行,把 ue = e.decode('latin-1') 直接改成 ue = e 。另外766还有类似的uo = o.decode('latin-1'),改成 uo=o ;问题4:TypeError: can't concat bytes to str原因:定位一下,报在了778行的内容escape(uo+ue) 。这是因为我们上面给uo赋值的时候,走的是else流程,uo被赋值的是bytes类型的值。 而bytes类型不能直接转化为str类型。所以我们需要在前面给uo赋值的时候先将bytes类型转换为 str类型。解决方法:修改768行的 uo = o ,直接改成 uo = o.decode('utf-8') 。另外 774还有类似的  ue = e, 改成 ue = e.decode('utf-8')。问题5:TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'RPCProxy'原因: python3  不支持 print >> sys.stderr 这种写法,这里定义输出流的话,采用print("This is print str",file=sys.stderr) 这种方式。解决方法:定位到631行,把print的语句修改掉,原来是print >>sys.stderr, 'nTime Elapsed: %s' % (self.stopTime-self.startTime), 可改成 print('nTime Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)问题6:TypeError: 'str' does not support the buffer interface原因:定位一下,问题出在118行,这里s是str类型,我们需要把传过来的s转化为bytes类型。解决方法:定位到118行,把 self.fp.write(s) 修改为 self.fp.write(bytes(s,'UTF-8')) 即可。

     来自: https://www.cnblogs.com/wangjunjiehome/articles/9262061.html

也可以直接下载修改好的HTMLTestRunner.py,打开如下链接

       https://download.csdn.net/download/qq_24047585/12402608 

3)将HTMLTestRunner.py文件放于项目folder下或者是Python38目录下即可。

4.3 查看生成的报告

这样就可以得到一个HTML的简单的报告啦~~~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。