图像相似度算法的一点粗糙应用――GUI测试
51Testing软件测试网:O*ZevQS
因为一些私人的事情,本来早已经应该完成的一篇文章一直到今天才可以草草了结。在前面的两篇文章《图像相似度算法的C#实现及测评》《对“画条线”(Draw a line)的单元测试几点想法和实践》中,先后介绍了一个简单的会读直方图算法和一些关于GUI画图的测试想法。有必要说明的是,在《对“画条线”(Draw a line)的单元测试几点想法和实践》中提到的几种方法,最实用的是Mock法并不是今天的主题。
$KlrRP `&h0&cUi+Uor,l0 这篇文章中继续前面的思路,简单写写有关GUI自动化测试的一点想法。51Testing软件测试网G[ `3{(Km6v
51Testing软件测试网p)u&q+A7j#Y[问题
b hBjeG8G y9[06x/kp+}e0 对于画线,画图等应用程序的功能自动化测试的解决方案?51Testing软件测试网'aK8YReq:Y
+@3on(M3O im0解决思路
S1H2O~.j/tFO8@05JT_ mx2D0 采取截图法,即将用例中的输出截图,以图片作为输出结果,当然之前需要一个相应的图片作为预期结果,以便于比较。
!eDF2sh0G+h E0v:J ?L/{ I ?0 对于预期结果图片,可以采用的方式是先运行一次自动化测试代码截得一幅图片,然后手动检查图片是否为与其效果,如是则将该图片作为预期结果。(在功能自动化测试中,在第一次运行自动化测试脚本的时候,是应该在人工监视的条件下进行的,而更多时候在我们调试相应的脚本的时候就已经完成了相应的工作。)51Testing软件测试网8eU,w1l!^wS4x0f
y2kv&H a0示例代码51Testing软件测试网;{tv.Ur'x,t KFl
51Testing软件测试网)D%y%tZ#pv!N+a1,待测代码示例51Testing软件测试网*@*}a{W+f fPI
Draw A Line
[`9V L!xJ{0 /// <summary>51Testing软件测试网YP*c h&W
/// 在Windows窗口上画图形
~ Ed0\{ WiL7HY0 /// </summary>51Testing软件测试网&v-].y1Id5w
class Draw_A_Line : System.Windows.Forms.Form
7k3CD.s/qh0 {
0_3M h(Uzz#]0 //private Form MainForm;
0B4]/f s3GS]x0 System.ComponentModel.Container component = null;
K1E e-D(w0 Pen myPen = new Pen(Color.Black);51Testing软件测试网G:x YTCH5z
Bitmap bmpImg = null;51Testing软件测试网;mB Yy}
;h%Qm4b)q{/BVWR9y0 public Draw_A_Line()
HW"M?!Z0XUe;U0 {
'|H"qw2b @s,Z0 InitializeComponent();51Testing软件测试网0{\8|:mb3_*g
}51Testing软件测试网b,~+G9OE'I5F
51Testing软件测试网0?B;GQx U
private void InitializeComponent()51Testing软件测试网4N6d"Xz-W
{51Testing软件测试网kH3H"q|_f9d h
this.component = new System.ComponentModel.Container();
;uE u5t6Ag0 this.Size = new Size(256, 256);
j [/Cm_{ n)oC0K0 this.Text = "TestMainForm";
d^H:O$K7k9|(zi051Testing软件测试网!y9Vh+@;hL
}51Testing软件测试网_6X^*o1N
+v)QU,TY ?0 /// <summary>51Testing软件测试网:tkQ$r Cn;~MO3Nd
/// 清理正在使用的资源
,_ H |;|Zu,}H0 /// </summary>
0x%fy_KLc0 /// <param name="disposing"></param>51Testing软件测试网o'b:A$Z3r a3}A3|
protected override void Dispose(bool disposing)
nXVw1k+H2`2M x0 {
M%OB{.C ?V0 if (disposing)
V0v'{0oH\Q0 {51Testing软件测试网S f7@.s4I,w3q
if (component != null)51Testing软件测试网-A` j&a|9uR
{51Testing软件测试网d`BK#s
saveBmp(); //保存截图
9E.T F c;i7L{B$|-_0 component.Dispose();
3v@*b"HE.nzE0 }
NN6]&[2d(N/Zw0 }
'} D#CC{_*fc&A0 base.Dispose(disposing);
Z+bA2d+}5N*dZq0 }51Testing软件测试网~ABd6v|0Z
_ iVd^ O{1[xL:n0 //static Graphics SaveGraph;51Testing软件测试网f9~D2tv
protected override void OnPaint(PaintEventArgs e)
}f!r8f ]0 {51Testing软件测试网\"U3ckh j^ _D
Graphics g = e.Graphics;
8z!s&M2{&i^a,j,`0 myPen.Width = 5;51Testing软件测试网7i.l?_z
g.DrawLine(myPen, 16, 27, 38, 49);51Testing软件测试网IQ/WHka+c'D
}
%i)XZs9KO)C}I2v} I0 }
[`9V L!xJ{0 /// <summary>51Testing软件测试网YP*c h&W
/// 在Windows窗口上画图形
~ Ed0\{ WiL7HY0 /// </summary>51Testing软件测试网&v-].y1Id5w
class Draw_A_Line : System.Windows.Forms.Form
7k3CD.s/qh0 {
0_3M h(Uzz#]0 //private Form MainForm;
0B4]/f s3GS]x0 System.ComponentModel.Container component = null;
K1E e-D(w0 Pen myPen = new Pen(Color.Black);51Testing软件测试网G:x YTCH5z
Bitmap bmpImg = null;51Testing软件测试网;mB Yy}
;h%Qm4b)q{/BVWR9y0 public Draw_A_Line()
HW"M?!Z0XUe;U0 {
'|H"qw2b @s,Z0 InitializeComponent();51Testing软件测试网0{\8|:mb3_*g
}51Testing软件测试网b,~+G9OE'I5F
51Testing软件测试网0?B;GQx U
private void InitializeComponent()51Testing软件测试网4N6d"Xz-W
{51Testing软件测试网kH3H"q|_f9d h
this.component = new System.ComponentModel.Container();
;uE u5t6Ag0 this.Size = new Size(256, 256);
j [/Cm_{ n)oC0K0 this.Text = "TestMainForm";
d^H:O$K7k9|(zi051Testing软件测试网!y9Vh+@;hL
}51Testing软件测试网_6X^*o1N
+v)QU,TY ?0 /// <summary>51Testing软件测试网:tkQ$r Cn;~MO3Nd
/// 清理正在使用的资源
,_ H |;|Zu,}H0 /// </summary>
0x%fy_KLc0 /// <param name="disposing"></param>51Testing软件测试网o'b:A$Z3r a3}A3|
protected override void Dispose(bool disposing)
nXVw1k+H2`2M x0 {
M%OB{.C ?V0 if (disposing)
V0v'{0oH\Q0 {51Testing软件测试网S f7@.s4I,w3q
if (component != null)51Testing软件测试网-A` j&a|9uR
{51Testing软件测试网d`BK#s
saveBmp(); //保存截图
9E.T F c;i7L{B$|-_0 component.Dispose();
3v@*b"HE.nzE0 }
NN6]&[2d(N/Zw0 }
'} D#CC{_*fc&A0 base.Dispose(disposing);
Z+bA2d+}5N*dZq0 }51Testing软件测试网~ABd6v|0Z
_ iVd^ O{1[xL:n0 //static Graphics SaveGraph;51Testing软件测试网f9~D2tv
protected override void OnPaint(PaintEventArgs e)
}f!r8f ]0 {51Testing软件测试网\"U3ckh j^ _D
Graphics g = e.Graphics;
8z!s&M2{&i^a,j,`0 myPen.Width = 5;51Testing软件测试网7i.l?_z
g.DrawLine(myPen, 16, 27, 38, 49);51Testing软件测试网IQ/WHka+c'D
}
%i)XZs9KO)C}I2v} I0 }
V2p&M8Fu U8K1SJ P0 2,截图代码
%L5o7E"t5_6\"[.c%A0SaveBMP
wY#SV1t0[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]51Testing软件测试网vh.H/@2B F
public static extern int BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);
RIn:Od,E6l0
+s:c\-S&hx051Testing软件测试网b.b'R VYg
public void saveBmp()51Testing软件测试网YDW;q@C0r
{51Testing软件测试网E)s"B#Mc4dCG J7GM1ZZ
//这里假设要保存一个窗体的内容51Testing软件测试网/iqRLM,N-}{fN
/l4p b%a:NdyQ0 int width = 200; //获取宽度51Testing软件测试网&g S l|(X
51Testing软件测试网U m8i4FG.rr6^:{-Z
int height = 200; //获取高度
D,x D_*rp-y051Testing软件测试网V7cGjUcP)?sl
const int SRCCOPY = 0xcc0020; //复制图块的光栅操作码51Testing软件测试网1BQ1cHH4x
51Testing软件测试网A]l:j+cej1AE'GE7G
Bitmap bmSave = new Bitmap(width, height); //用于保存图片的位图对象
?mQ,Z,qV1H0
g v}8h*H)d3Rf+]0 Graphics gSave = Graphics.FromImage(bmSave); //创建该位图的Graphics对象51Testing软件测试网r)V/~E+~~Ta
f$h-b bu@,C0 HandleRef hDcSave = new HandleRef(null, gSave.GetHdc()); //得到句柄51Testing软件测试网3_o(n#yJE
0aSK;ZF0 Graphics gSrc = this.CreateGraphics(); //创建窗体的Graphics对象51Testing软件测试网 Jv8Zb5sN
51Testing软件测试网V_(}#j#\"@P%D0A'p
HandleRef hDcSrc = new HandleRef(null, gSrc.GetHdc());51Testing软件测试网RM,i-DC aU|.t
51Testing软件测试网7OO7v4v!g
BitBlt(hDcSave, 0, 0, width, height, hDcSrc, 0, 0, SRCCOPY);
'_F3V0? K+I Q0
[,U'LfTA0 gSrc.ReleaseHdc();
+x%~ dX5f*qZ;z!lC051Testing软件测试网o/pUm*kP&~
gSave.ReleaseHdc();51Testing软件测试网S:`SL q*N\
f4Wq[1Vy9v0 bmSave.Save(@"C:\test.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
h!L ~d/I0
xx zNFWq8V0 gSrc.Dispose();
*YkX^mQ5e051Testing软件测试网8s1X+xY,R#i N
gSave.Dispose();
h&h-{3JQ'F Y051Testing软件测试网;^^@'|Hv@
bmSave.Dispose();
(r&f
wY#SV1t0[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]51Testing软件测试网vh.H/@2B F
public static extern int BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);
RIn:Od,E6l0
+s:c\-S&hx051Testing软件测试网b.b'R VYg
public void saveBmp()51Testing软件测试网YDW;q@C0r
{51Testing软件测试网E)s"B#Mc4dCG J7GM1ZZ
//这里假设要保存一个窗体的内容51Testing软件测试网/iqRLM,N-}{fN
/l4p b%a:NdyQ0 int width = 200; //获取宽度51Testing软件测试网&g S l|(X
51Testing软件测试网U m8i4FG.rr6^:{-Z
int height = 200; //获取高度
D,x D_*rp-y051Testing软件测试网V7cGjUcP)?sl
const int SRCCOPY = 0xcc0020; //复制图块的光栅操作码51Testing软件测试网1BQ1cHH4x
51Testing软件测试网A]l:j+cej1AE'GE7G
Bitmap bmSave = new Bitmap(width, height); //用于保存图片的位图对象
?mQ,Z,qV1H0
g v}8h*H)d3Rf+]0 Graphics gSave = Graphics.FromImage(bmSave); //创建该位图的Graphics对象51Testing软件测试网r)V/~E+~~Ta
f$h-b bu@,C0 HandleRef hDcSave = new HandleRef(null, gSave.GetHdc()); //得到句柄51Testing软件测试网3_o(n#yJE
0aSK;ZF0 Graphics gSrc = this.CreateGraphics(); //创建窗体的Graphics对象51Testing软件测试网 Jv8Zb5sN
51Testing软件测试网V_(}#j#\"@P%D0A'p
HandleRef hDcSrc = new HandleRef(null, gSrc.GetHdc());51Testing软件测试网RM,i-DC aU|.t
51Testing软件测试网7OO7v4v!g
BitBlt(hDcSave, 0, 0, width, height, hDcSrc, 0, 0, SRCCOPY);
'_F3V0? K+I Q0
[,U'LfTA0 gSrc.ReleaseHdc();
+x%~ dX5f*qZ;z!lC051Testing软件测试网o/pUm*kP&~
gSave.ReleaseHdc();51Testing软件测试网S:`SL q*N\
f4Wq[1Vy9v0 bmSave.Save(@"C:\test.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
h!L ~d/I0
xx zNFWq8V0 gSrc.Dispose();
*YkX^mQ5e051Testing软件测试网8s1X+xY,R#i N
gSave.Dispose();
h&h-{3JQ'F Y051Testing软件测试网;^^@'|Hv@
bmSave.Dispose();
(r&f