어떻게 자동화 테스트에서 전자메일을 수발합니까

8132 단어 automation

자동화의 이유


기본 UI 및 API 테스트는 간단합니다.어떻게 시작하는지에 관한 강좌와 동영상이 많다.
흥미로운 것은 일부 기능을 얻으면 수동으로 검사하기는 쉬우나 자동화하기는 쉽지 않다는 것이다.
그 중 하나는 이메일: 메시지를 보내고 메시지를 받았는지 확인하는 것이다.예를 들어 비밀번호 업데이트, 계좌 확인, 구매 확인 등 테스트를 할 수 있다.
이러한 상황에서 가능한 해결 방안은 테스트 중인 응용 프로그램을 약간 조정하는 것이다.
  • 프록시 서버로 메시지 포획하기;
  • 미리 정의된 응답 값을 가진 서버 캐시를 사용합니다.
  • 우리는 항상 개발자에게 도움을 구할 수 있다.그러나 그들의 시간과 우선사항은 우리의 책임 범위를 넘어섰다.그래서 우리는 스스로 답을 찾아야 한다.

    답을 찾다


    적합한 라이브러리를 검색하기 시작했을 때 GreenMail, Gmail API, Java Mail API 등의 옵션을 사용할 수 있습니다.
    Green Mail는 전자 우편 기능을 테스트하는 데 사용되는 소스 라이브러리다.SMTP, SSL 및 POP3 프로토콜을 지원합니다.이것은 단원과 통합 테스트에 사용되는 아름다운 도구로 쉽게 설정하고 사용할 수 있다.
    유일한 점은 순환 라이브러리 설계입니다. 로컬 호스트에만 배치하고 로컬에서만 메시지를 보내거나 포획할 수 있도록 만들어집니다.
    Gmail API Gmail 애플리케이션으로 가능한 모든 일을 할 수 있습니다.만약 기능이 완비되고 메일을 광범위하게 사용하는 응용 프로그램이 목표라면 이것은 매우 좋은 API이다.
    그러나 이를 사용하는 단점은 업무 견본을 얻기 위해 많은 추가 절차를 거쳐야 한다는 것이다.
  • 곡가운 플랫폼
  • 에 계정 만들기
  • 많은 권한을 가진 응용 프로그램 만들기
  • 사용자 추가
  • 액세스 토큰 생성
  • 추가할 더 많은 절차...
  • Java Mail(자카르타 메일)은 메일과 메시지 응용 프로그램을 구축하는 프레임워크이다.그것은 각종 메일 서버(예를 들어 Gmail, Yahoo, Outlook)에 전자메일을 보내고 받는 데 API를 제공한다.자바메일도 자바EE 플랫폼의 일부이기 때문에'기업급'라이브러리입니다.
    왜 우리 사례에서 그것을 사용하지 않습니까?

    Gmail 테스트 계정 구성


    Gmail을 사용하여 테스트를 진행하기 위해서는 create a separate test account가 필요합니다.그것을 위해 좋은 추측하기 어려운 비밀번호를 설정하십시오.(암호 관리자를 사용하여 안전한 곳에 저장합니다.)
    이 계정에 중요한 정보를 저장하지 마십시오. - 수시로 메일을 삭제하십시오.
    다음 단계에서는 추가 보안 조치를 처리합니다.
  • 테스트에서 이중 요소 권한 닫기Google account
  • Google Account / Security에서 "안전한 어플리케이션 액세스"열기
  • [Gmail 설정] [IMAP]
  • 에서 POP3 및 IMAP 열기

    구현 코드(Scala에서)


    메시지를 보내고 받으려면 다음과 같이 하십시오.
  • 접속 속성 추가(Gmailhere 호스트 및 포트에 대한 자세한 내용)
  •     val properties = System.getProperties
        properties.put("mail.smtp.host", "smtp.gmail.com")
        properties.put("mail.smtp.port", "465")
        properties.put("mail.smtp.auth", "true")
        properties.put("mail.smtp.ssl.enable", "true")
        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
        properties.put("mail.store.protocol", "imaps")
        properties.put("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
        properties.put("mail.imap.socketFactory.fallback", "false")
        properties.put("mail.imaps.usesocketchannels", "true")
        properties
    

  • 로그인 이름과 비밀번호를 사용하여 세션 대상을 만드는 방법을 추가합니다
    사용자 이름과 비밀번호는 src/test/resources/application에 저장되어 있음을 주의하십시오.conf 파일.
        private def getSession(properties: Properties) = {
            val session: Session = Session.getInstance(properties, new Authenticator() {
            override protected def getPasswordAuthentication: PasswordAuthentication = {
                new PasswordAuthentication(config.getString("username"), config.getString("password"))
                }
            })
            session.setDebug(false)
            session
        }
    

  • 메시지 보내기 준비 방법
    이 예제에서는 텍스트와 텍스트를 사용하여 새 메시지를 만듭니다.txt 파일을 첨부 파일로 사용합니다. (이 두 파일은 모두 Resources 폴더에서 읽습니다.)이것이 바로 우리가 두 개의 다른 MimeType 대상을 만들어야 하는 이유입니다. 하나는 메시지에 사용되고, 다른 하나는 첨부 파일에 사용됩니다.그리고 이 두 부분은 모두 다른 대상인 여러 부분에 추가해야 한다.
    우리는 자바를 사용합니다.우편물메시지를 전송하는 데 사용합니다.
        private def sendEmail(session: Session, from: String, to: String, subject: String, messagePath: String, attachment: String): Unit = {
            val message = new MimeMessage(session)
            message.setFrom(new InternetAddress(from))
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to))
            message.setSubject(subject)
    
            val textPart = new MimeBodyPart
            textPart.setText(Source.fromResource(messagePath).mkString)
    
            val filePart = new MimeBodyPart
    
            val res = getClass.getClassLoader.getResource(attachment)
            val file = Paths.get(res.toURI).toFile
    
            val fds = new FileDataSource(file.getAbsolutePath)
            filePart.setDataHandler(new DataHandler(fds))
            filePart.setFileName(fds.getName)
    
            val multipart = new MimeMultipart
            multipart.addBodyPart(textPart)
            multipart.addBodyPart(filePart)
    
            message.setContent(multipart)
    
            Transport.send(message)
        }
    

  • 메시지 수신 준비 방법
    새 Message CountListener가 폴더 객체에 추가되었습니다.대기 기능은promise와Idle Manager를 사용하여 이루어지며, 후자는 폴더 변경을 기다립니다.
        private def receiveEmail(session: Session, folder: Folder, subject: String): Message = {
            val manager = getIdleManager(session)
            val event = waitForFirst(awaitForNewMessages(folder, manager))(_
            .getMessages.toList.head.getSubject.contains(subject)).futureValue
    
            val message = event.getMessages.toList.head
    
            message
        }
    
        private def awaitForNewMessages(folderName: Folder, idleManager: IdleManager): Future[MessageCountEvent] = {
            val promise = Promise[MessageCountEvent]
            folderName.addMessageCountListener(new MessageCountAdapter {
            override def messagesAdded(e: MessageCountEvent): Unit = {
                promise.trySuccess(e)
                } 
            })
            idleManager.watch(folderName)
            promise.future
        }
    

  • e-메일 전송 및 수신 테스트 수행
    테스트의 경우 ScalaTest 라이브러리와 "should" matchers
        val messageSubject = "DEBUG MESSAGE"
        val folderName = "Inbox"
        val to: String = config.getString("recipient")
        val from: String = config.getString("sender")
        val props: Properties = getProperties
    
        "Client" should "be able to send email message" in {
            val session: Session = getSession(props)
    
            sendEmail(session, from, to, messageSubject, "files/test.txt",
            "files/test_attachment.txt")
        }
    
        "Client" should "be able to receive email message" in {
            val session: Session = getSession(props)
    
            val folder: Folder = openFolderInMailBox(session, folderName)
    
            val message = receiveEmail(session, folder, messageSubject)
    
            message.getSubject should be (messageSubject)
        }
    
  • 결론


    만약 개발자이고 전자메일 기능을 단독으로 테스트하고 싶다면 그린메일은 좋은 선택입니다.
    Java Mail API는 e-메일 처리에 적합하지 않습니다.그러나 표준 JavaEE 라이브러리에서 사용할 수 있으며, 상자를 열면 바로 사용할 수 있다.
    전체 코드 예는 src/test/scala/email/MailApiTest에서 찾을 수 있습니다.scala 파일code samples.
    e-메일/암호를 응용 프로그램에 붙여넣는 것을 잊지 마십시오.src/test/resources의 conf 파일입니다.

    좋은 웹페이지 즐겨찾기