在对某个网页进行测试用例的设计时,看到一个新增 xx 的功能,包括上传图片,如下所示:
可以比对上传前后图片的 MD5 值,但是如果上传后服务端对图片进行压缩处理就不能这么干了,另外上传方图之后展示在列表中的圆形图片其实是前端 CSS 样式处理过的,原图仍是方形的图片。
以商城新增某新商品为例,需要填写的商品资料有名称、生产厂家、进价、是否允许促销、生产日期、过期日期、展示图片等。可以有两种自动化测试方案:
图片未经处理,若要验证上传后仍然是原始图片,需要比较两个文件的 HashCode 或 MD5 或 CRC32 来实现。若 HashCode 相同,那么两个图片文件必定相同,包括文件名、文件大小和分辨率等。
PS. 你最好先到软件设计文档确认后,然后决定是否再跟开发确认图片是否要被处理。
没有被压缩,并且有规律的命名规则。
请问如何通过 selenium 获取图片的 md5 呢,两个文件的意思是获取到传上去后的图片吗?
selenium 应该不提供 MD5 校验,需要使用脚本语言 (C#、Java 或 Python) 来实现。两个文件是指上传前后的文件。
请问上传后的文件是如何获取到呢?直接获取属性 value 吗?还是 src?
另外,如果要对图片进行测试,需要自己去生成图片吗?如本页面图片上传提示不可以超过 300kb,如果实现对该情况的分情况测试呢?
大于 300kb,等于 300kb,小于 300kb 的图片如何实现呢?
通过查询页面获取上传后的文件,再使用脚本语言获取文件的 HashCode 或 MD5。
上传前需要自己使用第三方图片编辑工具按要求 (大于等于小于 300kb) 生成测试所需的图片。这属于测试数据准备。
@ 醋精测试媛 说个题外话,怎么感觉你现在自动化已经逐渐到了只要人工做测试的都要做自动化的程度了?
你要考虑维护成本。比如后面要求从小于 300kb 变成小于 500kb,开发只需要改个参数,1 分钟不到的事情,然后你的自动化用例得重新找等于 500kb、大于 500kb 的素材并替换进去,还得跑一遍确认下对不对,一般至少需要 5 分钟。这么算,你的成本至少是开发的 5 倍。
并且 UI 自动化由于各种偶然因素,失败率一般会比较高,所以为了保障稳定性能达到 90% 以上,还需要做一些调优;用例多了执行起来太慢,要并行之类的加速。这些调整都是成本。
自动化应该主要关注出问题会 P0 故障的场景,这些是尽可能保障每次代码变更都不会出问题的,所以要自动化高频率跑。至于那些出问题其实影响不大的,不一定值得做自动化。
所以我之前做的是通过 PIL 生成图片,如果开发改变参数,我也改变参数就可以了,但是确实速度上慢太多了。
另外就是校验这个图片的正确性确实比较复杂。
我知道如何定位元素,但是 md5 需要的是 file.read(),要的是图片文件而不是图片元素,我的疑惑是如何获取上传后的文件。
试过 urllib.urlretrieve(src) 远程下载,但是由于 url 存在 blob,无法解析。
1MB 以下的图片对比,也就几十到几百 ms,很快的
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.io.File;
public class ImageUtils {
public static boolean sameImage(File fileA, File fileB) {
try {
BufferedImage bufferedImageA = ImageIO.read(fileA);
DataBuffer dataBufferA = bufferedImageA.getData().getDataBuffer();
int sizeA = dataBufferA.getSize();
BufferedImage bufferedImageB = ImageIO.read(fileB);
DataBuffer dataBufferB = bufferedImageB.getData().getDataBuffer();
int sizeB = dataBufferB.getSize();
if (sizeA != sizeB) {
return false;
}
for (int i = 0; i < sizeA; i++) {
if (dataBufferA.getElem(i) != dataBufferB.getElem(i)) {
return false;
}
}
return true;
} catch (Exception e) {
System.out.println("Failed to compare image files ...");
return false;
}
}
public static float compareImage(File fileA, File fileB) {
try {
BufferedImage bufferedImageA = ImageIO.read(fileA);
DataBuffer dataBufferA = bufferedImageA.getData().getDataBuffer();
int sizeA = dataBufferA.getSize();
BufferedImage bufferedImageB = ImageIO.read(fileB);
DataBuffer dataBufferB = bufferedImageB.getData().getDataBuffer();
int sizeB = dataBufferB.getSize();
int count = 0;
if (sizeA != sizeB) {
return 0;
}
for (int i = 0; i < sizeA; i++) {
if (dataBufferA.getElem(i) == dataBufferB.getElem(i)) {
count = count + 1;
}
}
return (count * 100) / sizeA;
} catch (Exception e) {
System.out.println("Failed to compare image files ...");
return 0;
}
}
}
个人建议:
这个功能一般很少变更吧,如果变更不多,用自动化的话就没有多少必要了。
变更的时候,手工验证下,没有必要用自动化了。