Automation Test in Maya Plugin Development
- 开发插件的功能A的时候随手建立场景, 测试插件的功能A. 测试通过后,测试场景就被丢掉.
- 发现插件的功能A有bug时, 修改代码, 然后随手建立场景, 测试bug. 测试通过后,测试场景就被丢掉.
- 添加功能B, 测试功能B通过后, 在使用的时候发现之前的功能A却产生了bug, 应该是在添加功能B的时候产生的bug.
- 在开发人员流动大的公司里, 一个开发人员离职了, 他所开发的代码交接给后续的开发人员.
后续开发人员很难了解原先代码的设计思路和细节, 同时在添加新功能时难免会引入bug.
一个可行的解决方法:
- 在开发过程中, 每增加一个新功能, 都应该写相应的testcase.
- 在开发过程中, 开发人员自己如果经常执行这些testcase(回归测试), 那么就能保证修改的代码不引入新的bug
- 一个开发人员离职了, 他所开发的代码交接给后续的开发人员. 后续开发人员看testcase,了解插件的功能如何使用.
在添加新功能的时候, 把之前所有的testcase都执行一遍, 就能保证之前的功能没有问题. 如果有问题的话, 也能构及时发现.
新的问题:
- 一个插件可能有大大小小十几个功能, 全部测试下来可能要十几分钟. 每次修改一下代码都要花这十几分钟做回归测试的话,
一天下来也写不了多少代码. 这样的开发效率太低.
解决方法:
- 做自动化测试. 把原先手动测试的工作让程序来做.
关于automation
框架
- 自己写
- 使用python unittest
如何写testcase
有了测试框架之后, 还需要有testcase. 才能让自动化测试真的有效. 关于如何写好testcase, 这里有一写个人的经验.
- testcase里一般使用unittets.assert()来测试某个变量的值是否等于正确的值.
- 如何比较数组
比如, 如果要测试一个deform插件. 需要判断变形后的点的坐标是否正确. unittets.assert()不能比较list类型, 所以需要我们自己写.
要比较normal, nv等数据, 也需要这么做.
- 如果要测试一个shader该怎么写testcase? 怎么判断物体上的每个像素的值都是正确的呢?
可以把第一次渲染出的图片保存, 作为正确的图片(参考图片), 以后每次渲染出的图片和参考图片做比较. 我简称这种方法为"参考图比较".
其实, 对于判断vertex position, normal, nv 都可以用这种方法做回归测试.
测vertex position的话, 渲染一张图就能看得出点的坐标是否正确;
测vertex normal的话, 给mesh赋一张材质,渲染一张图就能看得出点的normal是否正确;
测vertex uv的话, 给材质赋一张checker纹理,渲染一张图就能看得出点的uv是否正确;
怎么样? 是不是觉得这个方法非常酷? 事实上, 如果你沿着这条路走下去的话, 你会发现实际上这是个无比大的坑! 但幸好这个坑还是有出路的.
所以, 我的建议是, 尽量不用"参考图比较"的方法, 而使用数组比较position, normal, nv这些值. 但如果要测试shader的话, 除了"参考图比较"的方法之外, 我没有想到更好的方法.
下面说一下"参考图比较"的方法, 以及会遇到哪些问题:
- 图片格式
备选项: jpg, exr, png, bmp, ...
以下是我选择图片格式的依据:
- 图片文件尽可能小.
- 方便查看. 比如, 我双击图片就可以查看, 如果能直接在文件管理器里浏览其缩略图就更好了.(所以, exr格式被剔除)
- 跨平台. (bmp在linux不太好, 所以被剔除)
似乎jpg, png都是不错的选择. 但jpg是有损压缩. 为了避免压缩导致图片不一致, 我最终还是选择png格式.
- 如何比较两张图片是否一致
- 用什么渲染器来渲染参考图
备选项:mayaSoftware, mentalray, arnold,
- 最好是maya自带的渲染器, 因为使用起来方便.
- 所以, 似乎mayaSoftware是首选. 但如果你用这个渲染器, 会发现每次渲染的图片都不一致(虽然人眼不出差异). 出来的图片根本不适合做参考图.
- 其次, mentalray每次渲染的图片是一致的. 但是, 相同maya版本, 不同平台下, mentalray渲染的图片有时会不一致. 更糟糕的是, 不同maya版本的mentalray渲染的图片差异很大.
为什么? 因为mentalray在不断的更新, 比如采样的方法变了, 渲染出的图片肯定就不一样了.
- 如何制作testcase的maya文件
- 批量更新testcase的maya文件, 是一件非常痛苦的事情
Automation Test in Maya Plugin Development的更多相关文章
- Tips For Your Maya Plugin Development
(The reason why I write English blog is that I'm trying to improve my written English. The Chinese v ...
- Debugging Maya Plugin(C++) with CodeBlocks in Linux
My system is CentOS7 x64, Maya2015 x64 for Linux. - Make sure that your project is built with flag - ...
- eclipse preference plugin development store and get
eclipse plugin development: E:\workspaces\Eclipse_workspace_rcp\.metadata\.plugins\org.eclipse.pde.c ...
- Maya Plugin 编译Maya插件
Maya自身的功能就已经非常强大了,但是更棒的是它的扩展性非常强,提供API让用户自己来编写插件Plugin.Maya的插件主要是两种,一种是用C++编写的,后缀为".mll",另 ...
- 如何搭建maya plugin develop environment on MAC OS X
1.首先我使用的平台是xcode version 5.1.1 ,MAYA2015, MAX OS X 10.9.4. MAYA2015要求的是:Mountain Lion 10.8.5, Xcode ...
- eclipse plugin development -menu
org.eclipse.ui.menus locationURI MenuContribution locationURI = "[Scheme]:[id]?[argument-list]& ...
- JIRA Plugin Development——Configurable Custom Field Plugin
关于JIRA Plugin开发的中文资料相当少,这可能还是由于JIRA Plugin开发在国内比较小众的原因吧,下面介绍下自己的一个JIRA Plugin开发的详细过程. 业务需求 创建JIRA IS ...
- Building GCC 4.1.2 in CentOS 7 for Maya API development
Following the official guid: http://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/files/Setting_up_y ...
- How to programmatically new a java class which implements sepecified interface in eclipse plugin development
http://w3facility.org/question/how-to-programmatically-new-a-java-class-which-implements-sepecified- ...
随机推荐
- Mysql游标阻止执行最后一次
DELIMITER $$ USE `you`$$ DROP PROCEDURE IF EXISTS `stockCursor`$$ CREATE DEFINER=`root`@`localhost` ...
- Javascript 事件对象(三)事件冒泡
事件流---事件冒泡取消冒泡:ev.cancelBubble=true ---事件捕获Ie下是没有的,在绑定事件中,标准下是有的 <!DOCTYPE HTML> <html> ...
- 10 条有趣的 Linux 命令
在终端工作是一件很有趣的事情.今天,我们将会列举一些有趣得为你带来欢笑的Linux命令. 1. rev 创建一个文件,在文件里面输入几个单词,rev命令会将你写的东西反转输出到控制台. # rev & ...
- Swift-----类型转换 、 嵌套类型 、 扩展 、 协议 、 访问控制
使用is和as操作符判断和转换数组中的对象类型 1.1 问题 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例.在Swift中使用is和as操作符实现类型转换. 本案例定义一个媒体类 ...
- 研华运动控制卡 SoftMotion 技术简介
SoftMotion为研华在设备自动化中的一项重要核心技术,相较于过去市面上ASIC 运动控制解决方案,研华自动化团队自主技术开发软件运动控制技术,并且透过现场可程序逻辑门阵列 (FPGA, Fiel ...
- 页面无法加载main.css
html应该用append,不是html,会覆盖掉文件
- 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...
- storyboard tabbarcontroller设置tab的图片
在storyboard里逐项设置了图片,咦,怎么是颜色?别急,慢慢来 找到你的tabbarcontroller指向的viewcontroller,在viewdidload里做如下事,搞定 - (voi ...
- 转载《 LayoutInflater 的inflate函数用法详解》
很多人在网上问LayoutInflater类的用法,以及inflate()方法参数的含义,现解释如下: inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById ...
- Python列表
列表不同于字符串和元组:列表是可变的--可以改变列表的内容 1.列表函数 1.list(x)函数(其实是一种类型,而不是一个真正意义上的函数) 转化为列表,其中x可以是其他序列 可以用''.join( ...