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

来源:互联网 发布:php 伪造来路 编辑:程序博客网 时间:2024/04/27 14:38

主要组成如下:

  • Test Fixture:准备及清理工作。

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

  • Test Suite:多个测试的集合。

  • Test Runner:测试执行。

  • Test        Report:测试报告。

测试通常由3A组成:

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

  • Act:实际功能。

  • Assert:断言。

其他框架有Pytest和Nose等。

TestCase类

测试方法以test_开头

import unittestfrom selenium import webdriverclass 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 unittestfrom 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 unittestfrom selenium import webdriverfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.webdriver.common.by import Byfrom __builtin__ import classmethodclass 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 Trueif __name__ == '__main__':    unittest.main(verbosity=2)

再组合起来,见smoketests.py:

import unittestfrom searchtests import SearchTestsfrom homepagetests import HomePageTest# get all tests from SearchProductTest and HomePageTest classsearch_tests = unittest.TestLoader().loadTestsFromTestCase(SearchTests)home_page_tests = unittest.TestLoader().loadTestsFromTestCase(HomePageTest)# create a test suite combining search_test and home_page_testsmoke_tests = unittest.TestSuite([home_page_tests, search_tests])# run the suiteunittest.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 unittestimport HTMLTestRunnerimport osfrom searchtests import SearchTestsfrom homepagetests import HomePageTest# get the directory path to output report fileresult_dir = os.getcwd()# get all tests from SearchProductTest and HomePageTest classsearch_tests = unittest.TestLoader().loadTestsFromTestCase(SearchTests)home_page_tests = unittest.TestLoader().loadTestsFromTestCase(HomePageTest)# create a test suite combining search_test and home_page_testsmoke_tests = unittest.TestSuite([home_page_tests, search_tests])# open the report fileoutfile = open(result_dir + '\SmokeTestReport.html', 'w')# configure HTMLTestRunner optionsrunner = HTMLTestRunner.HTMLTestRunner(stream=outfile,                                       title='Test Report',                                       description='Smoke Tests')# run the suite using HTMLTestRunnerrunner.run(smoke_tests)

0 0