基于Outlook的自动化脚本设计


基于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等方法的使用。


Author: Alan_Yuan
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Alan_Yuan !
 Previous
性能测试之LR经典案例 性能测试之LR经典案例
Performance 测试也是自动化测试的一个重点领域,了解和掌握这一部分内容,也是完善自动化测试技能的一个补充。Performance测试包含的内容很多,这可以从其支持的协议看出。但日常测试中往往集中在HTML,WebService等协
Next 
The Common Knowledge of Python - III The Common Knowledge of Python - III
上一篇文章中重点介绍了Python的函数及其使用场景,这篇文章将重点放在Python类及文件操作上,也是通过简单的实例加强对类的认知。类是面向对象编程的一个根本,使用面向对象编程可模拟现实情景,其逼真程度达到了令你惊讶的地步。这也是面向对象
2015-10-25
  TOC