基于Outlook邮件的测试用例自动化实现
如何自动化操作Outlook也是大家比较关心的话题,有些Application有邮件发送功能,对这部分功能进行测试,我们常常会收到一封邮件,判断邮件的接受与否往往是断定测试成败的一个参考。同时我们也希望把测试的结果以邮件的形式自动发送给客户。这些涉及到对邮件应用程序接口的操作,下面我大概总结下这些常见功能的用法。
跟其他应用程序一样,Outlook也也为用户保留了一个统一的编程接口MAPI,使用这个接口提供的方法和属性,我们可以轻松的操作Outlook. 先来介绍了如何自动发送邮件功能吧。
1. 运用QTP/UFT如何自动发送Outlook邮件
这个功能相信很多做测试的人都期待实现。特别是当测试完成后自动发一封邮件给相关人员,是不是感觉特别专业?好了,废话少说,直接给代码实现。下面的函数将发送一封邮件给相关人员,并加载一附件。
Function SendA_Mail_to_SpecifiedPeople(maiTo, mailCC, mailBCC, subject, mailbody, attchedFile)
Set mailObj = CreateObject("Outlook.application")
set mailMsg = mailobj.CreateItem(olMailItem) '创建一封新邮件。
'Set mailSpc = mailobj.GetNamespace("MAPI")
mailMsg.to = maiTo
mailMsg.CC = mailCC
mailMSG.BCC = mailBCC
mailMsg.Subject = subject
mailMsg.body = mailbody
mailMsg.Importance = olImportanceHigh
mailMsg.attachments.add attchedFile
mailMsg.send
mailMsg.Quit
Set mailObj = Nothing
Set mailMsg = Nothing
End Function
是不是很简单?还不快试试。这里需要强调一点的是CreateIte()方法,它可以创建Outlook支持的各种邮件类型。CreateItem(olMailItem)方法最常用。它封装了新建邮件的基本功能。
2. 检测Outlook Top文件夹
这个功能也很实用,很多人在自己的邮箱里设置了不同时期的个人邮件夹,这里给出了如何识别并进入指定的邮箱文件夹。
Set myItem = CreateObject("Outlook.application")
maxFile = myItem.GetNamespace("MAPI").Folders.Count
For i = 1 To maxFile
Set checkMailBoxFile = myItem.GetNamespace("MAPI").Folders(i)
Print checkMailBoxFile
Next
程序将打印出你的个人邮箱文件夹来。确定要进入那个邮箱,你也可以直接将参数i换成个人邮箱文件夹的名称。如想进入“2012.10-2013.10” 的邮箱,就将i替换成这个邮箱名即可。
3. 检索默认邮箱的文件夹
这个实例将检索默认邮箱的各个子文件夹
Set myItem = CreateObject("Outlook.application")
For i = 1 To 15
set mailBox = myItem.GetNamespace("MAPI").GetDefaultFolder(i)
msgbox mailBox
Print i & " : "& mailBox
Next
运行结果为:
3 : 已删除邮件
4 : 发件箱
5 : 已发送邮件
6 : 收件箱
7 : 收件箱
8 : 收件箱
9 : 日历
10 : 联系人
11 : 日记
12 : 便笺
13 : 任务
14 : Reminders
有了这个清单,我们很容易进入相关的文件夹。比喻想检索收件箱,我们只需将变量i设置为6,7,8即可。每个人的默认邮箱设置可能不同,这个清单值也有可能会不一样。有兴趣的话可以自己测试下。
接下来就是查看收件箱里的邮件了,下面我将给大家介绍几个常用的方法。有了这些 方法,我们可以查看是否有新的邮件进来,是否属于测试过程中产生的邮件。我想这也是大家最感兴趣的功能点了。一起来看看下面的实现。
4. 检索默认邮箱的Inbox文件夹
先来看看如何进入默认邮箱的收件夹(Inbox)和如何检索Inbox里的各个子文件夹。请看下面的代码。
Set myItem = CreateObject("Outlook.application")
countFolders = myItem.GetNamespace("MAPI").GetDefaultFolder(6).Folders.Count
For i = 1 To countFolders
Set getEachFolder = myItem.GetNamespace("MAPI").GetDefaultFolder(6).Folders._
Item(i)
Print i & ": " & getEachFolder
Next
这是对我的邮箱运行后的测试结果,请参考。
1: Automation Community
2: Boss’ Mail
3: China_SalesIT_DevTeam
4: Conversation History
5: CQ Team
6: Customer’s Mail
7: Deleted Items
8: EnglishCorner_Datum
9: Important Notices
10: Inida_Chandrababu
11: Inida_Vijay
12: ITI_ChianTeam
13: ITI_Customer
14: MDA_Team
15: PDIM_NA
16: Press_Team
17: Private Mail
18: SalesIT-MDMIT
19: ATPT
基于收件夹里的这些子文件夹,也许你要问,我想知道ATPT文件夹里的邮件个数和未读邮件个数。那么该怎么做呢? 请看下面的代码。
5. 检索收件箱里指定文件夹的邮件
下面的代码实现了查看ATPT文件夹的邮件数,未读邮件数,指定发件人的邮件数以及符合邮件主题的未读邮件数。这些功能正好可以用来检查我们是否能收到应用程序向我们发送的邮件。 是不是很激动?
Set myItem = CreateObject("Outlook.application")
Set checkInboxFolder = myItem.GetNamespace("MAPI").GetDefaultFolder(6).Folders.Item("ATPT")
mailCount = checkInboxFolder.Items.Count
unreadMailCount1 = checkInboxFolder.UnReadItemCount ‘此句等同于下面的语句
unreadMailCount2 = checkInboxFolder.Items.Restrict("Not [Unread] = 'True'").Count
’此句等同于上面的语句
Print "TotalMailCount :" & mailCount & vblf &_
"unreadMailCount1 : " & (unreadMailCount1) & vblf &_
"unreadMailCount2 : " & unreadMailCount2
unreadMailCount3 = checkInboxFolder.Items.Restrict("[TO] = 'Yuan, Hong-Bo (Alan, HPIT-DS-TCoE)' And Not [Unread] = 'True'").Count
print "unreadMailCount3 : " & unreadMailCount3
unreadMailCount4 = checkInboxFolder.Items.Restrict("[CC] = 'Yuan, Hong-bo' And Not [Unread] = 'True'").Count
print "unreadMailCount4 : " & unreadMailCount4
unreadMailCount5 = checkInboxFolder.Items.Restrict("[BCC] = 'Ning Zhu' And Not [Unread] = 'True'").Count
print "unreadMailCount5 : " & unreadMailCount5
unreadMailCount6 = checkInboxFolder.Items.Restrict("[FROM] = 'Ning Zhu' And Not [Unread] = 'True'").Count
print "unreadMailCount6 : " & unreadMailCount6
执行后程序打印结果如下:
TotalMailCount :11
unreadMailCount1 : 3
unreadMailCount2 : 3
unreadMailCount3 : 3
unreadMailCount4 : 0
unreadMailCount5 : 0
unreadMailCount7 : 3
6. 检索收件箱指定文件夹里指定的邮件
其实上面的方法应该足以帮助我们应对那些有关Outlook的测试用例了。当然我们也可以深入邮件内容去检查,看是否有满足需求的邮件存在。常用的方法是还是调用olMailItem的方法去实现。
例如,这里ATPT文件夹里有一份title为这样的邮件,我们需要检验是否存在这样的一份邮件。怎么写脚本呢?
Mail Title :Announcement: our project ‘ABC’ will release 2.09 from 9:30am to 1:00pm on 6/30/2014 (UTC Time)
Set myItem = CreateObject("Outlook.application")
Set checkInboxFolder = myItem.GetNamespace("MAPI").GetDefaultFolder(6).Folders.Item("ATPT")
checkInboxFolder.Display
Set specifiedMails = checkInboxFolder.Items.Restrict("[subject] = 'Announcement: our project ‘ABC’ will release 2.09 from 9:30am to 1:00pm on 6/30/2014 (UTC Time)'")
Msgbox specifiedMails.Count
'检索有多少封title为指定内容的邮件
Set specifiedMails = checkInboxFolder.Items.Restrict("[subject] = 'Announcement: our project ‘ABC’ will release 2.09 from 9:30am to 1:00pm on 6/30/2014 (UTC Time)' And Not [Unread] = 'True'")
Msgbox specifiedMails.Count
'检索有多少封title为指定内容的邮件并且状态是未读的
Set specifiedMails = Nothing
Set checkInboxFolder = Nothing
Set myItem = Nothing
点评:
上面的几个案例主要围绕有关Outlook用例自动化的解说,一般来说,对任何外部引用程式的自动化都需要获得该应用程式的开放式用户接口,outlook提供了三个重要的GUI接口(Microsoft.Office.Interop.Outlook.MAPIFolder/ Microsoft.Office.Interop.Outlook.MailItem/ Microsoft.Office.Interop.Outlook.
_NameSpace),对这些接口方法的调用是实现自动化的测试的根本。这一届重点需要掌握的是CreateItem(olMailItem),Folder,GetDefaultFolder以及Item等方法的使用。