unittest框架及自动化测试
之前在公司做过自动化测试的知识分享,现在把它记录下来。
•一、如何更好的编写测试用例
•1.模块化:将一些基础的、共有的步骤代码独立为单独的模块,使用时再调用。好处:可以使代码复用,减少代码编写,利于变动时维护。比如登录,退出等操作。
•2.参数化:将参数变化的输入,可以读取文件,或者产生随机数。比如新增操作,很多时候要求数据唯一,参数化后可以有效解决这个问题。
•
•二、如何方便的组织、运行测试用例
•1.用例的组织架构划分清晰。这样利于查找、维护
•2.命名规范。这样便于识别哪些是测试用例
•三、用例执行结果的要求
•1.能导出结果,进行统计,并显示错误
•三、Unittest模块的简单介绍
• unittest是一个单元测试的工具,提供了一些方法来方便进行单元测试。我们在这里用到它主要是解决上面说的几个问题,再概况一下就是
•1、提供用例组织与执行方法
•①unittest 所提供有 TestSuite()类,其中的addTtest()方法,可以将命名规范的用例“组装”起来(一个py文件可以有几个用例)
•②defaultTestLoader 类,discover() 方法可以识别一定命名规则的文件,结合①就可以将不同文件中全部的测试用例组装好
•③TextTestRunner()类, 通过它下面的 run()方法来运行 suite 所组装的测试用例
•2、提供比较方法
• 用例的执行,总会有预期结果。unittest提供了很多比较的方法,比如assertEqual(a, b),用法:assertEqual(first, second, msg=……..),这是相等的方法,最后的msg是当不相等时,提供的提示信息。
•
3、提供丰富的日志、清晰的报告
使用扩展HTMLTestRunner生出测试报告3、提供丰富的日志、清晰的报告
四、实例
•文件结构:
•…/ program/ all_test.py
• login.py
• xitongguanli/ test_1.py
• / test_2.py
•
•解释:①all_test.py,是组装、运行测试用例
• ②login.py是一个独立出来的登录模块
• ③test开头的文件,就是测试用例所在的文件
1.all_test.py
#coding=utf-8 import unittest import HTMLTestRunner import time def creatsuite(): testunit=unittest.TestSuite() #定义测试文件查找的目录 test_dir='F:\\python\\selemium\\program' #定义 discover 方法的参数 discover=unittest.defaultTestLoader.discover(test_dir, pattern ='test_*.py', top_level_dir=None) #discover 方法筛选出来的用例,循环添加到测试套件中 for test_suite in discover: for test_case in test_suite: testunit.addTests(test_case) print testunit return testunit alltestnames = creatsuite() if __name__ == '__main__': now = time.strftime("%Y-%m-%d %H_%M_%S") filename = 'F:\\python\\selemium\\program\\'+now+'result.html' fp = file(filename,'wb') runner = HTMLTestRunner.HTMLTestRunner( stream = fp, title = u'测试报告', description = u'用例的执行情况') runner.run(alltestnames) fp.close()
2.login.py
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(10) driver.get("http://www.baidu.com") def login(): driver.find_element_by_xpath("//div/div/div[@id='u1']/a[7]").click() driver.find_element_by_css_selector("#TANGRAM__PSP_8__userName").clear() driver.find_element_by_css_selector("#TANGRAM__PSP_8__userName").send_keys("xxxx") driver.find_element_by_css_selector("#TANGRAM__PSP_8__password").send_keys("xxxxxxx") driver.find_element_by_css_selector("#TANGRAM__PSP_8__submit").click()
3.test_1.py
#coding=utf-8 from selenium import webdriver import unittest, time, login import random random1 = random.randint(100000, 200000) class MyTest(unittest.TestCase): u'''百度搜索用例''' def setUp(self): self.driver = login.driver #self.driver.maximize_window() #self.driver.implicitly_wait(10) #self.base_url = "http://www.baidu.com" def test_baidu(self): driver = self.driver login.login() time.sleep(2) #driver.get(self.base_url + "/") driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys(random1) driver.find_element_by_id("su").click() time.sleep(2) title = driver.title #self.assertEqual(title, random1+u"_百度搜索") def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
最后的结果是这样子的: