接昨天的博客,今天继续学习Unittest单元测试框架
编写测试
搜索一个产品,检查是否返回一些相应的结果。test方法是在TestCase类中实现。重要的一点是需要给测试方法命名为test开头。
对于test runner能找到的每个测试方法,都会在执行测试方法之前先执行setUP()方法,确保每个测试方法都能依赖相同的环境,无论类中有多少测试方法。使用assertEqual()方法来验证用程序搜索该术语返回的结果是否和预期结果相匹配。
添加一个新的测试方法test_search_by_category(),通过分类来搜索产品,然后校验返回的产品的数量是否正确。如下所示:
import unitttest
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 testbox
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))
代码清理
TestCase类会在测试执行完成后调用tearDown()方法来清理所有的初始化值。在测试完成的时候清理掉由setUP() 方法初始化的数值。
在例子中,测试执行完成后,不需要Firefox的实例,将在tearDown()方法中关闭Firefox实例:
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 testbox
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 tearDown(self):
#close the browser window
self.driver.quit()
运行测试
通过命令运行测试,在测试用例中添加对main方法的调用。
将传递verbosity参数以便使详细的测试总量展示在控制台
if_name_=='_main_':
unittest.main(verbosity = 2)
可以把测试脚本保存为普通的python脚本。通过运行python 脚本名字.py来执行测试。
添加其他测试
为测试类添加其他的测试,新的测试方法命名也要以test开头
def test_search_by_name(self):
#get the search testbox
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))
运行这个测试类会看到两个Firefox的实例打开和关闭
&通过setUPClass()方法和tearDownClass()方法以及@classmethod标识来实现让各个测试方法共用一个Firefox实例,不用每次创建一个新的实例,代码修改为下:
import unittest
from selenium import webdriver
class 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 testbox
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 testbox
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()