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文件, 是一件非常痛苦的事情
运行自动化测试的一些技巧

转载于:https://www.cnblogs.com/yaoyansi/p/4761651.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala集合中添加元素_如何在Scala中将元素添加到列表中?

scala集合中添加元素In Scala, lists are immutable data structures in which adding new elements is not allowed. So, here we will solve this problem that is generally done in functional programming paradigms. 在Scala中,列表是不可变的数据结构&#…

玩转Nacos参数配置!多图勿点

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Nacos 中的参数有很多,如:命名空间、分组名、服务名、保护阈值、服务路由类型、临时实例等&#xff…

软件工程 质量问题_软件质量| 软件工程

软件工程 质量问题软件质量 (Software Quality) Software Quality is the degree of agreement too direct or indirect requirements and assumptions. Software quality is determined as a field of study and practice that describes the sensible traits of software pro…

为什么wait/notify必须要和synchronized一起使用?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notify…

Magento Add Fee or Discount to Order Totals

2019独角兽企业重金招聘Python工程师标准>>> In this tutorial, we will see how to add new line item to magento order totals. What this means is that, how to add an additional Fee or Discount, or any kind of charge to order total of the magento chec…

再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!

在微服务项目中,如果我们想实现服务间调用,一般会选择Feign。之前介绍过一款HTTP客户端工具Retrofit,配合SpringBoot非常好用!其实Retrofit不仅支持普通的HTTP调用,还能支持微服务间的调用,负载均衡和熔断限…

ruby array_Ruby中带有示例的Array.delete_if方法

ruby arrayRuby Array.delete_if方法 (Ruby Array.delete_if Method) In the last articles, we have studied the Array methods namely Array.select, Array.reject and Array.drop_While, all these methods are non–destructive methods which means that they do not imp…

UIViewController生命周期的理解

if (self [super init])》if (self [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 》- (void)viewDidLoad{ [super viewDidLoad]; NSLog("---111111");} 》if (self [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { …

Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。…

在Python中使用一个元素创建一个元组

Its not simple to create a tuple with one element, if we try to create a tuple with parenthesis or without parenthesis, tuple will not be created. 创建具有一个元素的元组并不简单,如果我们尝试创建带有括号或不带括号的元组,则不会创建元组。…

Python之包管理工具

在Python环境中已经有很多成熟的包,可以通过安装这些包来扩展我们的程序。 例如,很多时候Python开发人员都会去PyPI网站去查找自己想要使用的包,然后进行安装。PyPI ( Python Package Index)是获得第三方 Python 软件包…

为什么wait和notify必须放在synchronized中?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notify…

java字符串转字符串列表_Java中的字符串列表示例

java字符串转字符串列表We have to read total number string i.e. "n", create a list of the Strings and input "n" strings, add then to print the all stings of the list in Java. 我们必须读取总数字符串,即“ n”,创建字符…

聊聊并发编程的10个坑

前言对于从事后端开发的同学来说,并发编程肯定再熟悉不过了。说实话,在java中并发编程是一大难点,至少我是这么认为的。不光理解起来比较费劲,使用起来更容易踩坑。不信,让继续往下面看。今天重点跟大家一起聊聊并发编…

macbook终端使用记(二)终端快捷键

为什么80%的码农都做不了架构师?>>> Command K清屏 Command T新建标签 Command M最小化窗口 Command W 关闭当前标签页 Command S 保存终端输出 Command D 垂直分隔当前标签页 Command Shift D 水平分隔当前标签页 Command shift {或}向左/向…

uint32_t 是常数吗_UINT_MAX常数,带C ++示例

uint32_t 是常数吗C UINT_MAX宏常量 (C UINT_MAX macro constant) UINT_MAX constant is a macro constant which is defied in climits header, it is used to get the minimum value of an unsigned int object, it returns the minimum value that an unsigned int object …

颜值爆表!Redis 官方可视化工具来啦,功能真心强大!

最近逛了一下Redis官方网站,发现Redis不仅推出了很多新特性,而且还发布了一款可视化工具RedisInsight。试用了一下感觉非常不错,最关键的是能支持RedisJSON之类的新特性,这是第三方工具无法比拟的。今天带大家体验一下RedisInsigh…

20个响应式网页设计中的“神话”误区

关于响应式网页的重要性我们已经证实了很长时间了,现在是该把焦点放到如何做出好的响应式网页设计的时候了。一起来看看吧! 虽然很多人都在谈论响应式网页,但并不是每个人都知道他们在说什么。很多时候你看到网上的一些信息也在挑战你对响应式…

char 类型的常数_CHAR_MAX常数,带C ++示例

char 类型的常数C CHAR_MAX宏常量 (C CHAR_MAX macro constant) CHAR_MAX constant is a macro constant which is defied in climits header, it is used to get the maximum value of a char object, it returns the maximum value that a char object can store, which is …

MySQL 索引失效的 15 种场景!

背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑。常见的现象就是:明明在字段上添加了索引,但却并未生效。前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参数下生效…