我们可以通过继承TestCase类并且在测试类中为每一个测试添加测试方法来创建单个测试或者一组测试。为了创建测试,我们需要使用TestCase类中的assert或者使用其中的一种assert方法。每个测试最重要的任务是调用assertEqual()来校验预期结果,调用assertTrue() 来验证条件,或者调用assertRaises() 来验证预期的异常。
除了添加测试,我们可以添加测试夹具——setUp()方法和tearDown()方法,创建或处置测试用例所需要的任何对象和条件。
让我们开始使用unittest,首先通过继承TestCase类然后添加一个测试方法,来写一个简单的测试。我们需要先引入unittest模块,然后定义一个继承于TestCase 类的子类,具体如下。
import unittest
from selenium import webdriver
class SearchTest (unittest.TestCase):
setUp方法:一个测试用例是从setUp()方法开始执行的,我们可以用这个方法在每个测试开始前去执行一些初始化的任务。可以是这样的初始化准备:比如创建浏览器实例,访问URL,加载测试数据和打开日志文件等。此方法没有参数,而且不返回任何值。当定义了一个setUp()方法,测试执行器在每次执行测试方法之前优先执行该方法。在下面的例子里,我们将用setUp()方法来创建Firefox的实例,设置properties,而且在测试开始执行之前访问到被测程序的主页。例子如下。
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/")
开始编写测试:有了setUp()方法,现在可以写一些测试用来验证我们想要测试的程序的功能。在这个例子里,我们将搜索一个产品,然后检查是否返回一些相应的结果。与setUp()方法相似,test方法也是在TestCase类中实现。重要的一点是我们需要给测试方法命名为test开头。这种命名约定通知test runner哪个方法代表测试方法。
对于test runner能找到的每个测试方法,都会在执行测试方法之前先执行setUp()方法。这样做有助于确保每个测试方法都能够依赖相同的环境,无论类中有多少测试方法。我们将使用简单的assertEqual()方法来验证用程序搜索该术语返回的结果是否和预期结果相匹配。
添加一个新的测试方法test_search_by_category(),通过分类来搜索产品,然后校验返回的产品的数量是否正确,具体如下。
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))
代码清理:类似于setUp()方法在每个测试方法之前被调用,TestCase类也会在测试执行完成之后调用tearDown()方法来清理所有的初始化值。一旦测试被执行,在setUp()方法中定义的值将不再需要,所以最好的做法是在测试执行完成的时候清理掉由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 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 tearDown(self):
# close the browser window
self.driver.quit()
运行测试:为了通过命令行运行测试,我们可以在测试用例中添加对main方法的调用。我们将传递verbosity参数以便使详细的测试总量展示在控制台。
if __name__ == '__main__':
unittest.main(verbosity=2)
我们可以把测试脚本保存为普通的Python脚本。在这个例子里,把测试保存为searchtests.py。保存文件以后,我们可以通过下面的命令行来执行该测试(python searchtest.py)