使用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等。
# python searchtests.py
test_search_by_category (__main__.SearchTests) ... ok
test_search_by_name (__main__.SearchTests) ... ok
----------------------------------------------------------------------
Ran 2 tests in 138.375s
OK
另外fail()可以无条件让用例失败。
先添加文件homepagetests.py,演示上面部分断言。
再组合起来,见smoketests.py:
执行结果:
# 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
HTMLTestRunner可以帮助生成HTML报告。见 smoketests_with_html_report.py:
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)
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法