Los objetos de la GUI se clasifican en dos jerarquías relacionadas: principal-secundario y propietario-en propiedad. Un ejemplo de relación principal-secundario es un recuadro de diálogo y un botón contenido en el recuadro de diálogo. Un ejemplo de relación propietario-en propiedad es una ventana de nivel superior y un recuadro de diálogo. Puede usar uno de estos dos tipos de jerarquía para un objeto.
En la implementación de proxy, es habitual que el modelo de objeto subyacente (por ejemplo, Java y HWND) confunda estos dos tipos de relaciones y que trate una relación de propietario-en propiedad como una relación principal-secundario simétrica. En este caso, el proxy debe denegar la posesión de un elemento principal cuando el modelo de relación preferido es propietario-en propiedad. Los métodos que se pueden usar para desplazarse por la jerarquía son: getParent(), getChildren(), getOwner() y getOwned().
Las propiedades son valores con nombre. La propiedad en sí no tiene un tipo, pero el valor sí. Evite la devolución de diferentes tipos para la misma propiedad. En ocasiones, un valor de propiedad puede ser una referencia a un objeto en lugar de un valor. Si este valor se devuelve a un script, se devuelve como un TestObject. Los métodos que permiten acceder a las propiedades son: getProperty(), setProperty(), getProperties() y getNonValueProperties().
De forma predeterminada, puede que los nuevos objetos de proxy no tengan propiedades y pesos de reconocimiento de objetos. Utilice la Biblioteca de objetos para asignar las propiedades y pesos de reconocimiento. Los métodos para acceder a las propiedades y pesos de los objetos son: getRecognitionProperties() y getRecognitionPropertyWeight(). Si existe más de un objeto de la misma clase en el objeto principal, añada la propiedad .classIndex (un valor numérico positivo empezando desde 0) como propiedad de reconocimiento para el objeto secundario.
Por lo general, la jerarquía entera de los objetos está correlacionada. Sin embargo, algunos objetos tienen más posibilidades de cambiar entre las versiones de la aplicación de prueba. Por ejemplo, en Java, es habitual añadir paneles para agrupar los objetos. Con Functional Tester, el usuario puede especificar que los objetos de proxy no se agrupen. Aunque los objetos no correlacionables no residen en la correlación de objetos de prueba, aparecen en la jerarquía de objetos mientras se desplaza por la jerarquía principal-secundaria. Los métodos para gestionar la jerarquía correlacionable son: shouldBeMapped(), getMappableParent() y getMappableChildren().
En algunos casos, el modelo de objeto subyacente admite un concepto de propiedades como, por ejemplo, Java, HTML y .NET. Functional Tester permite a los proxies implementar propiedades adicionales. Si un proxy implementa directamente una propiedad, el nombre de la propiedad debe tener un patrón diferente para evitar confusiones con otras propiedades del objeto. Inicie con un punto (.) las propiedades normales que puedan utilizarse para el reconocimiento. La estructura utiliza algunas propiedades administrativas que no se pueden utilizar para el reconocimiento. Los nombres de estas propiedades empiezan con el signo (#).
En muchos casos, el objeto subyacente tiene métodos que se pueden encontrar e invocar. La estructura y la implementación del dominio suelen gestionarlas directamente, pero getMethod() normalmente se implementa en un proxy base en un dominio.
Siempre que sea posible, haga que las acciones del ratón se reproduzcan desde el cristal. Si el nombre de un método incluye los términos "click" o "drag", haga que los sucesos del ratón realicen la acción. No utilice nombres de métodos como "click" o "drag" si los sucesos del ratón no se utilizan para implementar la acción. No utilice nombres de métodos que hagan referencia a claves o al teclado si los sucesos del teclado no implementan la acción. Haga que los métodos reflejen la acción que se va a realizar y que su reproducción sea fiable. Evite la heurística.
Los objetos pueden contener otros objetos y pueden tener una estructura interna que no esté expuesta como objetos u objetos anidados. Por ejemplo, una lista puede incluir elementos en ella, pero el objeto de lista no exponen los elementos como objetos en sí mismos. Este tipo de comportamiento es habitual en los objetos basados en HWND. El método más común en la gestión de subelementos es getSubitem(), así como métodos de acción del ratón como click(), drag() y doubleClick(). El método getSubitem() devuelve un valor nulo o una serie de caracteres.
Utilice cualquiera de las siguientes estrategias si no desea que los objetos de los subelementos se expongan como objetos de pleno derecho:
Declare el proxy del subelemento como no correlacionable. El objeto en el punto se comunica con su elemento principal y el proxy del elemento principal es el responsable de las acciones de grabación contra el objeto agregado y de admitir la reproducción de las acciones de la GUI basadas en el subsistema.
Durante la grabación, el proxy del subelemento pasa las llamadas processMouseEvent() a su elemento principal. El proxy del elemento principal es el responsable de las acciones de grabación contra el objeto agregado y de admitir la reproducción de las acciones de la GUI basadas en el subsistema.
Durante la grabación, el proxy del subelemento procesa las llamadas de processMouseEvent() y genera las llamadas del método en el objeto principal. El proxy del elemento principal no es el responsable de las acciones de grabación contra el objeto agregado, pero sí de admitir la reproducción de las acciones de la GUI basadas en el subsistema.
Prepare un nuevo tipo de referencia de objeto con etiqueta de modo que el registro de la referencia que anulado después de usarse como ancla. Esto permite anclar un objeto mediante subelementos de otro objeto. Puede correlacionar el objeto anidado como un elemento secundario del objeto principal.
Cuando implemente excepciones y errores, siga las directrices siguientes:
No muestra excepciones privadas o internas desde los proxies. Puede que la documentación de la API de los proxies no esté disponible. Utilice excepciones estándar, preferiblemente RationalTestExceptions.
Reutilice las excepciones del paquete com.rational.test.ft en Java o del espacio de nombres Rational.Test.Ft en .Net. Si un proxy de Java muestra una excepción com.rational.test.ftMethodNotFoundException y el script está escrito en VB, el script VB recibe una excepción Rational.Test.Ft.MethodNotFoundException. Si se muestra una excepción cuyo nombre no empieza con "com" en com.rational.test.ft, se organiza como una excepción rappedException.
Todas las RationalTestExceptions que se pueden organizar deben admitir un constructor que admita un único parámetro de serie.
Si añade una nueva excepción en un proxy implementado en Java que espera que se pueda devolver al cliente, asegúrese de implementar la misma excepción en .Net.
En Java, las excepciones se deben declarar, lo que puede suponer una molestia para algunos probadores. Muchas excepciones se producen desde prácticamente cualquier método de la GUI. Por lo tanto, utilice en tiempo de ejecución en lugar de excepciones en Java. Evite usar los errores. Un error puede detener toda la sesión de reproducción o grabación.
Si el objeto no se encuentra, la estructura muestra una excepción ObjectNotFoundException. Si el objeto se encuentra, pero se ha especificado un subsistema que no se encuentra, el proxy debe mostrar una excepción SubItemNotFoundException. La estructura detecta la SubItemNotFoundException y lo vuelve a intentar automáticamente.
Si las coordenadas de entrada hacen clic en un objeto o subelemento que se encuentra fuera de la región, cambie las coordenadas para incluir la región en el objeto o subelemento. Cuando esto ocurra, añada un mecanismo para generar una advertencia en el registro. Puede que el proxy deba usar clics basados en coordenadas porque el diseño de la pantalla del objeto no se puede describir por completo. Por ejemplo, en un JTree, la geometría PLUS_MINUS no se conoce, pero se puede encontrar en relación al subelemento al que se aplica. para el proxy es aceptable ampliar el área del subelemento para incluir PLUS_MINUS. Puede utilizar coordenadas negativas para los subelementos. Documente todas las infracciones del comportamiento normal. Asegúrese de que ningún subelemento con un clic de coordenadas especificado hagan clic fuera del objeto.
Si se hace clic en un objeto equivocado, muestre una excepción com.rational.test.ft.CoordinateOnWrongObjectException. El objeto equivocado podría solapar el destino correcto. Puede cambiar las coordenadas para evitar que el objeto secundario en el interior de un contenedor. Omita el punto especificado y busque otro punto en el que pueda hacer clic un objeto adecuado. Evite la grabación de coordenadas en objetos que sean elementos secundarios correlacionables y no permita hacer clic en los objetos equivocados.
Si se hace clic en un subelemento equivocado, muestre una excepción com.rational.test.ft.CoordinateOnWrongSubitemException. Esta excepción no se aplica a los clics asociados con un objeto en el que no se especifica un subelemento. Este tipo de clic se aplica solamente cuando se hace clic en el objeto y en cualquier subelemento de ese objeto. En este caso, el subelemento equivocado solapa el destino correcto, que probablemente sea un elemento secundario. Evite la grabación de coordenadas en los subelementos que contienen subelementos anidados para impedir esta excepción. Omita el punto especificado y busque otro punto en el que pueda hacer clic un subelemento adecuado.