在多台机器上分发你的鼻子测试,无需麻烦

distributed-nose的Python项目详细描述


#分布式nose将测试分布在多个节点上,无需麻烦

##tldr

###之前

机器1:

< Buff行情> $nosetests长测试套件 … 在401.109s中进行1312次测试

机器2:

< Buff行情> $echo"我很无聊:(" 我很无聊:( $uptime awk-f'平均加载:'{print'加载:'$2}' 负载:0.00、0.00、0.00

显影剂:

< Buff行情> $google chrome http://news.ycombinator.com" rel="nofollow">http://news.ycombinator.com

###之后

机器1:

< Buff行情> $export nose_nodes=2; $export nose_node_number=1; $nosetests长测试套件 … 在220.502秒内运行660次测试

机器2:

< Buff行情> $echo"我感到被爱" 我感到被爱 $export nose_nodes=2; $export nose_node_number=2; $nosetests长测试套件 … 在214.007s中运行652个测试

##测试套件的传奇

###压制未经测试的代码

你的测试套件有英雄也有坏蛋, 它的胜利和失误。 像许多其他故事一样, 从一个孤独的英雄开始。 大学毕业, 她加入了一个快乐的软件工程冒险家乐队。 在管理层的领导和众多人物的支持下, 他们建造了普通人喜欢和需要的东西。

慢慢地,事情开始改变。 结构不良且强耦合的代码潜入代码库, 使改变变得越来越困难 允许狡猾的虫子出现。 党员们开始经常破坏工程的不同部分, 范围太大,一个人不能很快地测量。 禁区变成禁区, 因为龙和未知的东西会夺走所有试图进入的人。

在这一切中,我们的英雄怀着沉重的心情看着。 对这个未经测试的代码库该怎么办? 她当然不能一个人改变一切吗? 她只是一个人!

最后,每天的挣扎使她筋疲力尽。

"够了就够了!"

"

她下定决心,高谈阔论如何最好地罢工。 反对未经测试的代码的压迫。

"我将编写测试,并将它们提交给源代码管理!"

" 她说, 理解工作代码是最好的论证。

###以鼻子为燃料的和平

有条不紊地挥舞和教学[鼻子](https://github.com/nose-devs/nose), 她从内部招募人员组成一支志同道合的开发队伍。 他们是TDD的团契 他们决心要成功。 测试是在大量高值代码中提交的!

团契的壮举激起了其他开发者的兴奋。 另一个英雄认为如果进行一些测试是好的, 那么一直运行所有的测试就更好了! 戴着系统管理的帽子, 他利用额外的服务器资源 一个连续的集成过程诞生了。

然而,我们的英雄对他们的成功过于自信。 很少试图证明这种做法是正当的, 写测试所花的时间要花在管理上。 管理层的监督行动压垮了我们刚刚起步的奖学金。

###管理层的后推

"如果你有时间写测试, 我给你的肯定不够!"

"

他们咆哮, 用最危险的武器威胁: 消极的、咄咄逼人的意见分歧。

我们的英雄再次鼓起勇气, 通过努力, 用高质量的利剑勇敢地战胜管理层的反对。 和平与生产力的新时代开始了 这个项目也很成功。

但这种和平不会持久。 缓慢的测试运行的幽灵笼罩着我们的英雄。 很快,测试失败就被忽略了。 开发人员并没有等待测试完成! 测试套件会衰退。

###多进程到达

开发人员抱怨不已,管理层自由地向i-tell-you-sos游说。 考试前的黑暗时代即将重现。

"我会加速你R测试!"

"

一个声音呼喊着。 又是我们的英雄, 发誓要从根本上打击腐败。

翻阅古文, 她很快发现 [多进程](http://nose.readthedocs.org/en/latest/plugins/multiprocess.html" rel="nofollow">http://nose.readthedocs.org/en/latest/plugins/multiprocess.html)。

"这将使我们摆脱单核束缚。"

她自信地宣称。 几小时后, 她的8核机器轻快地通过了测试。 很快,ci服务器上就开始使用多进程了, 测试速度向前加速。

在试验区一切正常! 她的开发伙伴举办了一个休息室聚会 为了她。 python meetup说流水 TDD再次受到所有人的喜爱。

就像以前的和平一样, 这也是暂时的, 因为增加更多的核心是昂贵的。 快进几个分数测试, 以及曾经快速的测试套件 经常让这个健壮的多核ci服务器屈服。

###分布绝望

记住实现多进程的易用性, 我们的英雄知道演习。 她只需将测试分发到多个服务器上! 同样的古籍也被人们满怀信心地查阅, 解决方案似乎显而易见。

但是等等!

简单的指南在哪里?

我们的英雄不是巫师。 她无法破解分布式系统的古老卷轴。 她没有时间接受正规的巫师训练, 所涉及的运动部件数量令人难以置信。

绝望开始了,曾经快速的甜蜜考验变得越来越慢。 我们冒险者的前景黯淡, 作为对加速测试本身的评估,显示了巨大的挑战。 有些人甚至建议完全放弃测试套件 对速度有了新的关注!

派系形成,党有分裂的危险!

###分布式鼻:可扩展的解决方案

"等一下。"

一个清晰的声音传了出来。 又是我们的英雄。

"为什么我们的测试人员需要沟通来协调? 我们的memcached服务器需要相同级别的协调 轻松实现!"

"

被一个念头的闪现逗乐, 她开始工作了。 她很坚定,把一大堆的书 [一致散列](http://en.wikipedia.org/wiki/consistent\u hashing" rel="nofollow">http://en.wikipedia.org/wiki/consistent\u hashing)。 一旦解决方案在她脑子里清楚了, 她碰巧遇到了一个有好建议的冒险家伙伴。

"你试过分布式鼻子吗?"

"

"很不幸。 我对花粉过敏 每年春天我都会得到它。"

在最初的混乱解决之后, 我们的英雄明白了 其他冒险家已经走过这条路了。 万岁!

她迅速略过一段紧张的叙述性介绍, 坦白地说,这是一种衍生。 跳转到书中可操作的部分, 她很快就成功了。 这是他们的工具。

用最少的努力, 测试套件分布在4台机器上。 缩短了测试时间 测试套件已保存。 思考未来,我们的英雄意识到 她再也不会面临可扩展性的不确定性。 她总是能增加更多的机器!

确保了测试套件的可扩展性, 我们的英雄将继续面对许多其他的冒险和考验。 但再也不会有什么东西如此接近抹去它们的核心 作为未经测试代码的压迫。

##为什么要分布鼻子?

使用两个测试标志在不受限制的机器上水平缩放测试。

##安装

  1. 获取项目源并安装它

    < Buff行情>

    $pip安装分布式nose

  2. < > >

    ##用法

    在一台机器上运行一半测试,在另一台机器上运行另一半测试:

    机器1:

    < Buff行情> $nosetests–nodes 2–node number 1 long_test_套件

    机器2:

    < Buff行情> $nosetests–nodes 2–nodes number 2 long_test_套件

    或者,您可以使用环境ent变量: *鼻节点 *鼻子节点号

    ###暂时禁用测试分发

    在使用环境变量的情况下 为了控制测试分布, 有时您可能仍然希望运行一次性测试。 与其摆弄环境变量, 您只需使用"Distributed Disabled"(分布式禁用)标志即可。

    < Buff行情> $export nose_nodes=2; $export nose_node_number=1; $nosetests–分布式禁用长测试套件

    ##分布算法

    要确定哪个节点运行哪个测试, 分布式nose依赖于[hash_ring](https://github.com/doist/hash_ring) 库的一致哈希实现。

    默认情况下,测试将单独散列到环。 如果所有测试都具有相同的运行时,这将导致最均匀的分布和最佳的速度。 但是,它复制了类设置/拆卸工作。 如果代价很高,您可以使用–hash by class或设置nose_hash_by_class; 这将把同一类中的测试散列到同一节点。

    ##运行测试套件

    测试套件需要nose,可以通过setup.py运行 < Buff行情> #python setup.py notests

    ##太棒了吗?

    是的。越来越多。

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像