您的位置:首页 > 编程语言 > Python开发

使用Python学习selenium测试工具-3:unittest库介绍

2016-07-04 11:29 441 查看
主要组成如下:

Test Fixture:准备及清理工作。

Test Case: 通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充。

Test Suite:多个测试的集合。

Test Runner:测试执行。

Test        Report:测试报告。

测试通常由3A组成:

Arrange:预置条件、相关配置和依赖等。

Act:实际功能。

Assert:断言。

其他框架有Pytest和Nose等。

TestCase类

测试方法以test_开头

import unittest
from selenium import webdriver

class SearchTests(unittest.TestCase):
def setUp(self):
# create a new Firefox session
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.driver.maximize_window()

# navigate to the application home page
self.driver.get("http://demo.magentocommerce.com/")

def test_search_by_category(self):
# get the search textbox
self.search_field = self.driver.find_element_by_name("q")
self.search_field.clear()

# enter search keyword and submit
self.search_field.send_keys("phones")
self.search_field.submit()

# get all the anchor elements which have product names displayed
# currently on result page using find_elements_by_xpath method
products = self.driver\            .find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(2, len(products))

def test_search_by_name(self):
# get the search textbox
self.search_field = self.driver.find_element_by_name("q")
self.search_field.clear()

# enter search keyword and submit
self.search_field.send_keys("salt shaker")
self.search_field.submit()

# get all the anchor elements which have product names displayed
# currently on result page using find_elements_by_xpath method
products = self.driver.\
find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(1, len(products))

def tearDown(self):
# close the browser window
self.driver.quit()

if __name__ == '__main__':
unittest.main(verbosity=2)
执行结果:

# python searchtests.py

test_search_by_category (__main__.SearchTests) ... ok

test_search_by_name (__main__.SearchTests) ... ok

----------------------------------------------------------------------

Ran 2 tests in 138.375s

OK

基于类的setUp()和tearDown()方法

上面每个用例都会初始化和清理一次,有时这不一定是必要的。@classmethod支持在一个类中只进行一次初始化和清理。

import unittest
from selenium import webdriverclass

SearchTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
# create a new Firefox session
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()

# navigate to the application home page
cls.driver.get("http://demo.magentocommerce.com/")
cls.driver.title

def test_search_by_category(self):
# get the search textbox
self.search_field = self.driver.find_element_by_name("q")
self.search_field.clear()

# enter search keyword and submit
self.search_field.send_keys("phones")
self.search_field.submit()

# get all the anchor elements which have product names displayed
# currently on result page using find_elements_by_xpath method
products = self.driver.\
find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(2, len(products))

def test_search_by_name(self):
# get the search textbox
self.search_field = self.driver.find_element_by_name("q")
self.search_field.clear()

# enter search keyword and submit
self.search_field.send_keys("salt shaker")
self.search_field.submit()

# get all the anchor elements which have product names displayed
# currently on result page using find_elements_by_xpath method
products = self.driver.\
find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(1, len(products))

@classmethod
def tearDownClass(cls):
# close the browser window
cls.driver.quit()

if __name__ == '__main__':
unittest.main(verbosity=2)


断言

断言有3种类型:相等、逻辑比较、异常。如果断言不通过,当前测试用例会停止,并报错。详细的断言参见unittest

另外fail()可以无条件让用例失败。

测试用例集(Test suites)

通过TestSuite, TestLoader和TestRunner可以有效地组织测试用例集。

先添加文件homepagetests.py,演示上面部分断言。

import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from __builtin__ import classmethod

class HomePageTest(unittest.TestCase):
@classmethod
def setUp(cls):
# create a new Firefox session """
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()

# navigate to the application home page """
cls.driver.get('http://demo-store.seleniumacademy.com/')

def test_search_field(self):
# check search field exists on Home page
self.assertTrue(self.is_element_present(By.NAME, 'q'))

def test_language_option(self):
# check language options dropdown on Home page
self.assertTrue(self.is_element_present(By.ID, 'select-language'))

def test_shopping_cart_empty_message(self):
# check content of My Shopping Cart block on Home page
shopping_cart_icon = self.driver.\
find_element_by_css_selector('div.header-minicart span.icon')
shopping_cart_icon.click()

shopping_cart_status = self.driver.\
find_element_by_css_selector('p.empty').text
self.assertEqual('You have no items in your shopping cart.',
shopping_cart_status)

close_button = self.driver.\
find_element_by_css_selector('div.minicart-wrapper a.close')
close_button.click()

@classmethod
def tearDown(cls):
# close the browser window
cls.driver.quit()

def is_element_present(self, how, what):
"""
Utility method to check presence of an element on page
:params how: By locator type
:params what: locator value
"""
try:
self.driver.find_element(by=how, value=what)
except NoSuchElementException, e:
return False
return True

if __name__ == '__main__':
unittest.main(verbosity=2)


再组合起来,见smoketests.py:

import unittest
from searchtests import SearchTests
from homepagetests import HomePageTest

# get all tests from SearchProductTest and HomePageTest class
search_tests = unittest.TestLoader().loadTestsFromTestCase(SearchTests)
home_page_tests = unittest.TestLoader().loadTestsFromTestCase(HomePageTest)

# create a test suite combining search_test and home_page_test
smoke_tests = unittest.TestSuite([home_page_tests, search_tests])

# run the suite
unittest.TextTestRunner(verbosity=2).run(smoke_tests)

执行结果:

# python smoketests.py

test_language_option (homepagetests.HomePageTest) ... ok

test_search_field (homepagetests.HomePageTest) ... ok

test_shopping_cart_empty_message (homepagetests.HomePageTest) ... ok

test_search_by_category (searchtests.SearchTests) ... ok

test_search_by_name (searchtests.SearchTests) ... ok

----------------------------------------------------------------------

Ran 5 tests in 223.231s

OK

生成HTML测试报告

插件
HTMLTestRunner可以帮助生成HTML报告。见 smoketests_with_html_report.py:

import unittest
import HTMLTestRunner
import os
from searchtests import SearchTests
from homepagetests import HomePageTest

# get the directory path to output report file
result_dir = os.getcwd()

# get all tests from SearchProductTest and HomePageTest class
search_tests = unittest.TestLoader().loadTestsFromTestCase(SearchTests)
home_page_tests = unittest.TestLoader().loadTestsFromTestCase(HomePageTest)

# create a test suite combining search_test and home_page_test
smoke_tests = unittest.TestSuite([home_page_tests, search_tests])

# open the report file
outfile = open(result_dir + '\SmokeTestReport.html', 'w')

# configure HTMLTestRunner options
runner = HTMLTestRunner.HTMLTestRunner(stream=outfile,
title='Test Report',
description='Smoke Tests')

# run the suite using HTMLTestRunner
runner.run(smoke_tests)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息