zoukankan      html  css  js  c++  java
  • 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生出测试报告
     
    四、实例
    •文件结构:
    •…/ 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()

     最后的结果是这样子的:

  • 相关阅读:
    TcxComboBoxProperties下拉框填充
    Delphi用QJSON解析JSON格式的数据 【转】
    Delphi的idhttp报IOHandler value is not valid错误的原因[转]
    RelayCommand
    ViewModelBase && ObservableObject
    MvvmLight ToolKit 教程
    WPF中的数据验证
    MvvmLight ToolKit .Net4.5版本 CanExecute不能刷新界面bug
    微软虚拟学院MVA 字幕获取方法
    WPF Binding INotifyPropertyChanged 多线程 深入理解
  • 原文地址:https://www.cnblogs.com/ohmydenzi/p/5597778.html
Copyright © 2011-2022 走看看