Os objetos da GUI são organizados em duas hierarquias relacionadas: pai-filho e proprietário-propriedade. Um exemplo de relacionamento pai-filho é uma caixa de diálogo e um botão incluído. Um exemplo de um relacionamento proprietário-propriedade é uma janela de nível superior e uma caixa de diálogo. Use qualquer um dos tipos de hierarquia para um objeto.
Na implementação do proxy, é comum para o modelo de objeto subjacente (por exemplo, Java™ e HWND) confundir esses dois relacionamentos e tratar o relacionamento proprietário-propriedade como um relacionamento pai-filho. Nesse caso, o proxy deve negar ter um pai quando o modelo de relacionamento preferencial for proprietário/propriedade. Os métodos que podem ser usados para percorrer a hierarquia são getParent(), getChildren(), getOwner() e getOwned().
As propriedades são valores nomeados. A própria propriedade não tem um tipo; o valor tem um tipo. Evite fazer os proxies retornarem tipos diferentes para a mesma propriedade. Às vezes um valor de propriedade pode ser uma referência para um objeto, e não para um valor. Se esse tipo de valor for retornado para um script, será retornado como um TestObject. Os métodos para acessar as propriedades incluem getProperty(), setProperty(), getProperties() e getNonValueProperties().
Por padrão, os novos objetos de proxy podem não ter pesos e propriedades de reconhecimento de objetos. Use a Biblioteca de Objetos para designar os pesos e as propriedades de reconhecimento. Os métodos para acessar os pesos e as propriedades de reconhecimento de objeto são getRecognitionProperties() e getRecognitionPropertyWeight(). Se mais de um objeto da mesma classe existir dentro do objeto-pai, inclua a propriedade .classIndex (um valor numérico positivo começando em 0), como uma propriedade de reconhecimento para o objeto-filho.
Geralmente, a hierarquia inteira de objetos é mapeada. No entanto, é muito provável que determinados objetos sejam alterados com freqüência entre builds do aplicativo de teste. Por exemplo, em Java, é comum incluir painéis para objetos de cluster juntos. Com o Functional Tester, o usuário pode especificar não mapear o objeto de proxy. Mesmo assim, os objetos não-mapeáveis não ficam no mapeamento de objeto de teste, a hierarquia de objeto os lista enquanto você percorre a hierarquia pai-filho. Os métodos para gerenciar a hierarquia mapeável incluem shouldBeMapped(), getMappableParent() e getMappableChildren().
Em alguns casos, o modelo de objeto subjacente suporta uma noção de propriedades, por exemplo, Java, HTML e .NET. O Functional Tester permite que os proxies implementem propriedades adicionais. Se um proxy implementar uma propriedade diretamente, essa propriedade deverá ter um padrão diferente para evitar confusão com qualquer propriedade do objeto. O início do nome de propriedades regulares que podem ser usadas para reconhecimento deve ser um ponto (.). Determinadas propriedades administrativas são usadas pela estrutura que não pode ser usada para reconhecimento; esses nomes de propriedades começam com um sinal numérico (#).
Em muitos casos, o objeto subjacente tem métodos que podem ser encontrados e chamados. Geralmente eles são gerenciados diretamente pela estrutura e pela implementação de domínio, mas getMethod() é comumente implementado em um proxy base em um domínio.
Reproduza as ações do mouse de glass sempre que possível. Se um nome de método incluir "click" ou "drag", os eventos de mouse desempenharão a ação. Não use nomes de métodos como "click" ou "drag" se os eventos de mouse não forem usados para implementar a ação. Não use nomes de métodos que façam referência às teclas ou ao teclado se eventos de teclado não implementarem a ação. Faça com que os métodos reflitam a ação que será desempenhada e autorizada durante a reprodução. Evite a heurística.
Os objetos podem conter outros objetos e podem ter uma estrutura interna que não é exposta como objetos aninhados. Por exemplo, uma lista pode ter itens nela, mas os itens não são expostos pelo objeto da lista como os próprios objetos. Esse tipo de comportamento é comum em objetos baseados em HWND. O método mais comum para lidar com subitens são getSubitem() e métodos de ação do mouse como click(), drag() e doubleClick(). O método getSubitem() retorna um nulo ou uma cadeia.
Use qualquer uma das seguintes estratégias se não desejar que os objetos nos subitens sejam expostos como objetos completos:
Declare o proxy do subitem como não mapeável. O objeto no ponto entra em contato com seu pai e o proxy-pai fica responsável por gravar as ações em relação ao objeto agregado e pelo suporte da reprodução de ações da GUI baseadas no subitem.
Durante a gravação, o proxy do subitem transmite as chamadas processMouseEvent() para seu pai. O proxy-pai fica responsável por gravar as ações em relação ao objeto agregado e pelo suporte da reprodução de ações da GUI baseadas no subitem.
Durante a gravação, o proxy do subitem processa chamadas processMouseEvent() e gera as chamadas de método no objeto-pai. O proxy-pai não fica responsável por gravar as ações em relação ao objeto agregado, mas fica responsável pelo suporte da reprodução de ações da GUI baseadas no subitem.
Tenha um novo tipo de referência de objeto que seja marcado para que o registro da referência seja removido depois de usado como âncora. Isso permite ancorar um objeto usando subitens de outro objeto. Você pode mapear o objeto aninhado como um filho do objeto-pai.
Siga estas regras enquanto implementa exceções e erros:
Não lance exceções privadas ou internas dos proxies. A documentação da API para seus proxies pode não estar disponível. Use exceções padrão, preferencialmente RationalTestExceptions.
Use novamente as exceções do pacote com.rational.test.ft em Java ou do espaço de nomes Rational.Test.Ft em .Net. Se um proxy java lançar uma exceção com.rational.test.ftMethodNotFoundException e o script for gravado em VB, o script VB obterá uma exceção Rational.Test.Ft.MethodNotFoundException. Se você lançar uma exceção que não tenha um nome que comece com "com" em com.rational.test.ft, ela será resolvida como uma exceção WrappedException.
Todas as RationalTestExceptions que podem ser resolvidas devem suportar um construtor que obtenha um único parâmetro de cadeia.
Se você inclui uma nova exceção em um proxy implementado em Java que espera poder retornar para o cliente, certifique-se de implementar a mesma exceção em .Net.
Em Java, as exceções devem ser declaradas, o que pode não ser útil para alguns testadores. Muitas exceções são provenientes de quase todos os métodos da GUI, portanto, use as exceções de tempo de execução em vez de usar as exceções de Java. Evite usar erros. Um erro deve fazer com que toda a sessão de reprodução ou gravação pare.
Se o objeto não for encontrado, a estrutura lançará uma exceção ObjectNotFoundException. Se o objeto for encontrado e um subitem for especificado, mas não for encontrado, o proxy deverá lançar a exceção SubItemNotFoundException. A exceção SubItemNotFoundException é detectada pela estrutura e faz-se uma nova tentativa automaticamente.
Se as coordenadas de entrada clicarem em um objeto ou subitem que esteja além da região, altere essas coordenadas para incluir a região no objeto ou subitem. Inclua um mecanismo para gerar um aviso no log quando isso ocorrer. O proxy pode ter que usar cliques baseados em coordenadas porque o layout de tela do objeto não pode ser completamente descrito. Por exemplo, em JTree, a geometria PLUS_MINUS não é conhecida, mas pode ser relacionada ao subitem ao qual ela se aplica. Ela é aceitável para o proxy para expandir a área do subitem para incluir PLUS_MINUS. Você pode usar coordenadas negativas para subitens. Documente todas as violações do comportamento normal. Verifique se nenhum subitem com um clique de coordenada específico clica além do objeto.
Se um objeto inválido for clicado, lance uma exceção com.rational.test.ft.CoordinateOnWrongObjectException. O objeto inválido pode sobrepor o destino correto. Você pode alterar as coordenadas para evitar o objeto-filho em um contêiner. Ignore o ponto especificado e procure por outro ponto em um objeto adequado para clicar. Evite coordenadas de gravação nos objetos que possuem filhos mapeáveis e que não permitem cliques em objetos inválidos.
Se um subitem inválido for clicado, lance uma exceção com.rational.test.ft.CoordinateOnWrongSubitemException. Essa exceção não se aplica a cliques associados com um objeto no qual um subitem não é especificado. Esse tipo de clique se aplica apenas quando o objeto e qualquer subitem naquele objeto é clicado. Nesse caso, o subitem inválido substitui o destino correto e provavelmente é um filho. Evite gravar as coordenadas nos subitens que tenham subitens aninhados para evitar essa exceção. Ignore o ponto especificado e procure por outro ponto um subitem adequado para clicar.