引用自:http://blog.csdn.net/kaku21/article/details/42124593

参考网址:http://programmaticallyspeaking.com/test-data-provider-using-python-metaclass.html

使用TestNG进行测试的时候,允许使用外部数据源来驱动测试方法的执行,举个例子:

我们有一个测试方法,而这个测试方法对应有10条测试数据,如果我们在测试方法中使用循环遍历这十条数据的话,很可能出现的问题是:

1.测试中的断言 assert 遇到一条数据执行结果错误时,退出测试方法

2.剩余的数据无法继续执行,产生的数据报告不完整

解决上述问题的方法,利用TestNG的dataprodvider在测试类中获取外部数据,然后传给测试方法,这样做到每一条数据驱动一次测试方法的执行,测试方法按数据量自动产生方法序号,报告测试结果。当某一条数据执行结果错误的时候,该方法对应的产生一次失败信息,但不影响下一条数据的执行。

在测试报告中,看到的是某一个方法,然后产生了多少条报告。

关于TestNG数据驱动的详情可以参考 http://testng.org/doc/documentation-main.html#parameters-dataproviders

我们要说的是,在python的unittest中没有类似的方法,当我们需要遍历测试数据的时候怎样更好的去查看结果生成报告呢?

目前我没有找到比较好的第三方组件,唯一的方式是自己来改写,参看下面的代码

<pre><span class="kn">import</span> <span class="nn">unittest</span>  

<span class="k">class</span> <span class="nc">DataProviderSupport</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="n">classname</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">classDict</span><span class="p">):</span>
<span class="c"># method for creating our test methods</span>
<span class="k">def</span> <span class="nf">create_test_method</span><span class="p">(</span><span class="n">testFunc</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
<span class="k">return</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="n">testFunc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="c"># look for data provider functions</span>
<span class="k">for</span> <span class="n">attrName</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">classDict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">attrName</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"dataprovider_"</span><span class="p">):</span>
<span class="c"># find out the corresponding test method</span>
<span class="n">testName</span> <span class="o">=</span> <span class="n">attrName</span><span class="p">[</span><span class="mi">13</span><span class="p">:]</span>
<span class="n">testFunc</span> <span class="o">=</span> <span class="n">classDict</span><span class="p">[</span><span class="n">testName</span><span class="p">]</span>
<span class="c"># the test method is no longer needed</span>
<span class="k">del</span> <span class="n">classDict</span><span class="p">[</span><span class="n">testName</span><span class="p">]</span> <span class="c"># generate test method variants based on</span>
<span class="c"># data from the data porovider function</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">args</span> <span class="ow">in</span> <span class="n">attr</span><span class="p">():</span>
<span class="n">classDict</span><span class="p">[</span><span class="n">testName</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)]</span> <span class="o">=</span> <span class="n">create_test_method</span><span class="p">(</span><span class="n">testFunc</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c"># create the type</span>
<span class="k">return</span> <span class="nb">type</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="n">classname</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">classDict</span><span class="p">)</span>

  

这里其实用到了元类的概念,也就是,我们重写的type元类的__new__函数

验证一下:

class TestStringLength(unittest.TestCase):
__metaclass__ = DataProviderSupport def dataprovider_test_len_function(): # no self!
yield ("abc", 3)
yield ("", 0)
yield ("a", 1) def test_len_function(self, astring, expectedLength):
self.assertEqual(expectedLength, len(astring))

  运行 python的unittest,结果如下:

元类的概念,请参考:

http://www.ibm.com/developerworks/cn/linux/l-pymeta/

http://blog.csdn.net/b2b160/article/details/4161189

这个函数能够返回当前类的类名称,类字典,同时可以创建测试方法 即 create_test_method

当有多个测试数据对应一个测试方法时,我们把测试方法增加了序号,如果在后续引用测试方法时,需要在测试方法名称后面添加序号

例如 suite.addTest(Testdriver(methodname+sn))

http://www.cnblogs.com/fnng/p/8185172.html

最新文章

  1. angularjs中文社区
  2. C#基础之泛型
  3. 【C#】1.1 第1章学习要点
  4. 解决spring-mvc @responseBody注解返回json 乱码问题
  5. (转)Struts 拦截器
  6. 怎样在WIN7系统下安装IIS和配置ASP(详细)
  7. Redis11种Web应用场景
  8. JavaScript 面试中常见算法问题详解
  9. 强一致性hash实现java版本及强一致性hash原理
  10. WebApi实现验证授权Token,WebApi生成文档等(转)
  11. hashmap和hashtable异同
  12. 总结react native 事件机制
  13. 用node.js模拟服务器和客户端
  14. Python之时间模块
  15. 看懂Oracle执行计划、表连接方式
  16. VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)
  17. 使用镶嵌数据集 MosaicDataSet管理不同分辨率影像数据
  18. Advanced Plugin Concepts
  19. Windows换行符问题
  20. elasticsearch5.5.2环境搭建

热门文章

  1. 阿里巴巴的26款Java开源项目,赶紧戳…
  2. Digital Twin——IoT的下一个浪潮
  3. SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-3 CASE表达式
  4. sublime中设置scala编译运行
  5. Python笔记_第四篇_高阶编程_正则表达式_2.正则表达式入门
  6. JVM探秘:jmap生成内存堆转储快照
  7. 浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷
  8. Nginx模块-ngx_http_mirror_module-流量复制【转】
  9. flask web实战1.27
  10. 实践一次有趣的sql优化