{"id":2260,"date":"2013-12-17T10:58:44","date_gmt":"2013-12-17T10:58:44","guid":{"rendered":"http:\/\/10.1.1.67:8116\/2015\/07\/09\/2-revision-v1\/"},"modified":"2023-10-11T09:37:41","modified_gmt":"2023-10-11T09:37:41","slug":"pruebas-de-quality-assurance-qa-12","status":"publish","type":"post","link":"https:\/\/fractaliasystems.com\/en\/pruebas-de-quality-assurance-qa-12\/","title":{"rendered":"Pruebas de QUALITY ASSURANCE \u201cQA\u201d (1\/2)"},"content":{"rendered":"<p>Hoy en d\u00eda vivimos en un mundo cada vez m\u00e1s exigente, con mucha competencia y es vital entregar un producto software de forma r\u00e1pida y segura. Un error en cliente puede conllevar quedarse fuera del proyecto, por lo que el asegurar la calidad es algo fundamental, y se necesita por tanto una estrategia clara para disponer de unas<strong> pruebas automatizadas<\/strong>, que aseguren la calidad de nuestras entregas, y permitan una respuesta r\u00e1pida a las necesidades del mercado.<!--more--><\/p>\n<p>Es sabido por todos que, cuanto antes se detecte un fallo, menor ser\u00e1 su coste de reparaci\u00f3n. Si se descubre en la fase de especificaci\u00f3n, basta con cambiar el texto del requisito, mientras que si se da en producci\u00f3n, los resultados pueden ser fat\u00eddicos, si se trata de un error muy grave.<\/p>\n<p>Existen varios niveles de pruebas:<\/p>\n<ol>\n<li>Pruebas unitarias: responsabilidad del equipo de Desarrollo.<\/li>\n<li>Pruebas de integraci\u00f3n: acci\u00f3n conjunta de Desarrollo y QA (Quality Assurance).<\/li>\n<li>Pruebas de sistema: tarea de QA.<\/li>\n<\/ol>\n<p>Adem\u00e1s se pueden diferenciar dos grandes conjuntos de pruebas:<\/p>\n<p>1. Pruebas funcionales:<\/p>\n<ul>\n<li><strong>Pruebas funcionales<\/strong>.<\/li>\n<li>Pruebas de humo.<\/li>\n<li>Pruebas de regresi\u00f3n.<\/li>\n<li>Pruebas de aceptaci\u00f3n.<\/li>\n<li>Alpha testing.<\/li>\n<li>Beta testing.<\/li>\n<\/ul>\n<p>2. Pruebas no funcionales:<\/p>\n<ul>\n<li>Pruebas de seguridad.<\/li>\n<li>Pruebas de usabilidad.<\/li>\n<li><strong>Pruebas de rendimiento<\/strong>.<\/li>\n<li>Pruebas de internacionalizaci\u00f3n y localizaci\u00f3n.<\/li>\n<li>Pruebas de escalabilidad.<\/li>\n<li>Pruebas de mantenibilidad.<\/li>\n<li>Pruebas de instalabilidad.<\/li>\n<li>Pruebas de portabilidad.<\/li>\n<\/ul>\n<p>En este primer post queremos centrarnos en las pruebas funcionales, tambi\u00e9n conocidas como las \u2018coded ui test\u2019 (<strong>CUITs<\/strong>) o \u2018robots\u2019 e indicaremos algunas recomendaciones identificadas por el equipo de<strong> Quality Assurance<\/strong> (QA) tras emplear Visual Studio 2012 en la realizaci\u00f3n de pruebas que garantizan el \u00f3ptimo desarrollo del software.<\/p>\n<p>A la hora de emplear herramientas software para la ejecuci\u00f3n de pruebas funcionales la idea es crear un \u2018puzzle\u2019 compuesto de peque\u00f1as pruebas que iremos combinando como \u00a0piezas simples y para posteriormente poder crear paso a paso tests m\u00e1s complejos. As\u00ed mismo, el objetivo es conseguir que dichas \u201cminipruebas\u201d sean lo m\u00e1s configurable posibles. Lo ideal es disponer de un datasource, Data Driven CUIT \u00e0 CUIT basada en datos: csv, excel, xml, sql, etc.<\/p>\n<p>Para ello hay que configurar cada prueba en particular \u00a0de \u00a0forma muy sencilla, por ejemplo se puede poner una l\u00ednea antes de cada test y especificar si el tipo de acceso es secuencial o aleatorio, tal y como aparece en el ejemplo.<\/p>\n<p><i>Ejemplo con un datasource de tipo data.csv y con acceso secuencial:<\/i><\/p>\n<p>[csharp]<\/p>\n<p>[DataSource(&#8220;Microsoft.VisualStudio.TestTools.DataSource.CSV&#8221;, &#8220;|DataDirectory|data.csv&#8221;, &#8220;data#csv&#8221;, DataAccessMethod.Sequential), DeploymentItem(&#8220;data.csv&#8221;), TestMethod]<\/p>\n<p>\/\/\/ y luego acceder con string paramVal = TestContext.DataRow[&#8220;Input1&#8221;]<\/p>\n<p>[\/csharp]<\/p>\n<p><span style=\"line-height: 1.5;\">Tambi\u00e9n aconsejamos grabar menos de 10 acciones cada vez, para hacerlo m\u00e1s modular y manejable.<\/span><\/p>\n<p>Hay que usar nombres significativos, para luego identificar las pruebas f\u00e1cilmente, lo que dar\u00e1 m\u00e1s facilidad a la hora de reutilizar y ejecutar dichas pruebas.<\/p>\n<p>Se pueden experimentar problemas a la hora de generar CUITs si la aplicaci\u00f3n a probar hace uso de controles de terceros. Esto se debe a que algunos no ofrecen soporte o el soporte es incompleto para CUITs. Existen 4 niveles de soporte:<\/p>\n<ul>\n<li>Soportar la grabaci\u00f3n, reproducci\u00f3n, y validaci\u00f3n de propiedades implementando la accesibilidad.<\/li>\n<li>A\u00f1adir la validaci\u00f3n de propiedades personalizadas, implementando un proveedor de propiedades.<\/li>\n<li>Soportar la generaci\u00f3n de c\u00f3digo, implementando una clase para acceder a las propiedades personalizadas.<\/li>\n<li>Soportar acciones conscientes de intenciones, implementando un filtro de acciones.<\/li>\n<\/ul>\n<p>Si se implementan estos cuatro niveles, el soporte ser\u00e1 completo.<\/p>\n<p>Tambi\u00e9n para reducir los problemas asociados al uso de controles de terceros, se pueden crear controles personalizados basados en controles de terceros o de .NET que implementen los cuatro niveles de soporte.<\/p>\n<p>A continuaci\u00f3n explicamos un ejemplo de automatizaci\u00f3n de pruebas que han sido configuradas para la realizaci\u00f3n de pruebas funcionales de nuestro producto Fractalia Media, plataforma de gesti\u00f3n y distribuci\u00f3n de contenidos en Digital Signage.<\/p>\n<p>En concreto las pruebas efectuadas se corresponden al:<\/p>\n<ul>\n<li>Login: Acceso a la herramienta.<\/li>\n<li>CrearCanal. En nuestro producto Fractalia Media, un canal se basa en una plantilla ya creada en la que se a\u00f1aden todos los spots. En esta plantilla se encuentran preconfiguradas las zonas de reproducci\u00f3n, la duraci\u00f3n de los spots y los efectos de transici\u00f3n, entre otros par\u00e1metros.<\/li>\n<li>CreaGrupoPerif\u00e9rico: En Fractalia Media, es necesario dar de alta a los dispositivos sobre los que se van a asignar los contenidos multimedia. Para facilitar la distribuci\u00f3n de contenidos y listas de reproducci\u00f3n (playlist), es posible crear grupos compuestos por m\u00faltiples dispositivos multimedia.<\/li>\n<\/ul>\n<p style=\"text-align: center;\"><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/QA-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-103 aligncenter\" title=\"Pruebas Quality Assurance. CUITs\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/QA-2-1024x788.png\" alt=\"Pruebas Quality Assurance. CUIT\" width=\"604\" height=\"464\" \/><\/a><\/p>\n<p>Las pruebas se pueden visualizar en el test explorer y lanzar desde ah\u00ed. Tiene multitud de filtros, para poder ejecutar s\u00f3lo el conjunto que nos interese cada vez.<\/p>\n<p>En el ejemplo concreto que os presentamos se pueden apreciar:<\/p>\n<ul>\n<li>DEMO_HacerLogin.<\/li>\n<li>DEMO_CrearCanal.<\/li>\n<li>DEMO_CrearGrupoPeriferico.<\/li>\n<li>DEMO_CrearGrupoPerifericoConDatasource.<\/li>\n<\/ul>\n<p>Lo interesante de estas pruebas, es que se tratan de pruebas<strong> at\u00f3<\/strong><b>micas, configurables y se pueden reutilizar<\/b>. As\u00ed para componer la prueba funcional de creaci\u00f3n de un canal (DEMO_CrearCanal), se llama primero a la de login (DEMO_HacerLogin). Todas estas pruebas llevan en la cabecera la palabra \u2018TestMethod\u2019, para que puedan estar accesibles desde el test explorer y por tanto ser reutilizables.<\/p>\n<p><i>Ejemplo:<\/i><\/p>\n<p>[csharp]<br \/>\n[TestMethod]<br \/>\npublic void DEMO_CrearCanal()<br \/>\n{<br \/>\nLogin oLogin = new Login();<br \/>\noLogin.DEMO_HacerLogin(Properties.Settings1.Default.User, Properties.Settings1.Default.Password);<br \/>\nthis.UIMap.RC0_CrearCanal();<br \/>\n}<br \/>\n[\/csharp]<\/p>\n<p><i><\/i><span style=\"line-height: 1.5;\">A continuaci\u00f3n se muestra un ejemplo de c\u00f3digo para la creaci\u00f3n de grupos de perif\u00e9ricos con funciones propias para no repetir el nombre (DEMO_CrearGrupoPeriferico), y otra con un datasource de tipo csv (DEMO_CrearGrupoPerifericoConDatasource), donde se guardan previamente el nombre de los grupos.<\/span><\/p>\n<p>Es preciso introducir esta codificaci\u00f3n por parte del equipo de desarrollo ya que en la creaci\u00f3n de grupos perif\u00e9ricos Fractalia Media no permite la existencia de grupos con el mismo nombre, por lo que existir\u00eda una incongruencia al grabar la prueba, en el caso de que se quiere repetir.<\/p>\n<p>De esta forma, conseguimos que se pueden realizar tantas iteraciones de estas pruebas funcionales como se quieran y\u00a0 obtener de forma r\u00e1pida un gran volumen de datos de grupos de perif\u00e9ricos en base de datos de Fractalia Media, que sirvan como datasource para pruebas de carga, o simplemente para pruebas de regresi\u00f3n, para comprobar que los casos b\u00e1sicos de la aplicaci\u00f3n siguen funcionando correctamente.<\/p>\n<p><em>Ejemplo de Creaci\u00f3n de Grupo Perif\u00e9rico<\/em><\/p>\n<p>[csharp]<br \/>\nusing System;<br \/>\nusing System.Collections.Generic;<br \/>\nusing System.Text.RegularExpressions;<br \/>\nusing System.CodeDom.Compiler;<br \/>\nusing System.Windows.Input;<br \/>\nusing System.Windows.Forms;<br \/>\nusing System.Drawing;<br \/>\nusing Microsoft.VisualStudio.TestTools.UITesting;<br \/>\nusing Microsoft.VisualStudio.TestTools.UnitTesting;<br \/>\nusing Microsoft.VisualStudio.TestTools.UITest.Extension;<br \/>\nusing Microsoft.VisualStudio.TestTools.UITesting.HtmlControls;<br \/>\nusing Microsoft.VisualStudio.TestTools.UITesting.WinControls;<br \/>\nusing Microsoft.VisualStudio.TestTools.UITesting.WpfControls;<br \/>\nusing Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;<br \/>\nusing Mouse = Microsoft.VisualStudio.TestTools.UITesting.Mouse;<br \/>\nusing MouseButtons = System.Windows.Forms.MouseButtons;<br \/>\nusing DynamicDataGenerator;<br \/>\nnamespace UITestFMedia.DEMO<br \/>\n{<br \/>\n\/\/\/ &lt;summary&gt;<br \/>\n\/\/\/ Descripci\u00f3n resumida de CodedUITest1<br \/>\n\/\/\/ &lt;\/summary&gt;<br \/>\n[CodedUITest]<br \/>\npublic class GrupoPeriferico<br \/>\n{<br \/>\npublic GrupoPeriferico()<br \/>\n[TestMethod]<br \/>\npublic void DEMO_CrearGrupoPeriferico()<br \/>\n{<br \/>\n\/\/FMedia 5.7 RC0<br \/>\n\/\/Necesario estar en la pantalla del Content Manager<br \/>\n\/\/Con c\u00f3digo en esta propia clase<br \/>\nfor (int iCont = 0; iCont &lt; 5; iCont++)<br \/>\n{<br \/>\nCrearGrupoPeriferico(ObtainARandomString(5));<br \/>\n}<br \/>\n\/\/Con referencia a una dll de otro proyecto<br \/>\nfor (int iCont = 0; iCont &lt; 5; iCont++)<\/p>\n<p>[\/csharp]<\/p>\n<p><i>Ejemplo de Creaci\u00f3n Grupo Perif\u00e9rico con DataSource<\/i><\/p>\n<p>[csharp]<br \/>\nCrearGrupoPeriferico(DynamicData.CreateRandomString(5));<\/p>\n<p>[DataSource(&#8220;Microsoft.VisualStudio.TestTools.DataSource.CSV&#8221;, &#8220;.data.csv&#8221;, &#8220;data#csv&#8221;, DataAccessMethod.Sequential), DeploymentItem(&#8220;data.csv&#8221;), TestMethod]<br \/>\npublic void DEMO_ CrearGrupoPerifericoConDatasource()<br \/>\n{<br \/>\n\/\/FMedia 5.7 RC0<br \/>\n\/\/Necesario estar en la pantalla del Content Manager<br \/>\n\/\/A partir de datasource: csv<br \/>\nCrearGrupoPeriferico(testContextInstance.DataRow[&#8220;Nombre_Grupo&#8221;].ToString());<br \/>\n}<br \/>\npublic static string ObtainARandomString(int lenght)<br \/>\n{<br \/>\nstring returnedString = string.Empty;<br \/>\nint randomNumber = 0;<br \/>\nfor (int i = 0; i &lt; lenght; i++)<br \/>\n{<br \/>\n\/\/ We create chars from 65 to 90 (ASCII code) A &#8211; Z<br \/>\nrandomNumber = CreateRandomNumber(65, 90);<br \/>\nreturnedString += Convert.ToChar(randomNumber);<br \/>\n}<br \/>\nreturn returnedString;<br \/>\n}<br \/>\npublic static int CreateRandomNumber(int min, int max)<br \/>\n{<br \/>\nRandom oRandom = SingletonRandom.Instance.getRandomObject();<br \/>\nint NewNumber = oRandom.Next(min, max);<br \/>\nSystem.Threading.Thread.Sleep(10);<br \/>\nreturn NewNumber;<br \/>\n}<br \/>\npublic void CrearGrupoPeriferico(string sName)<br \/>\n{<br \/>\n#region Variable Declarations<br \/>\nWinClient uITreeGenericClient = UIMap.UIFractaliaMediaVersioWindow9.UIGestordePantallasWindow.UITreeGenericWindow.UITreeGenericClient;<br \/>\nWinMenuItem uIGruponuevoMenuItem = UIMap.UIItemWindow.UIDropDownMenu.UIGruponuevoMenuItem;<br \/>\nWinEdit uITextBoxEdit = UIMap.UINuevogrupodepantallaWindow.UITextBoxWindow.UITextBoxEdit;<br \/>\nWinButton uIAceptarButton = UIMap.UINuevogrupodepantallaWindow.UIAceptarWindow.UIAceptarButton;<br \/>\n#endregion<br \/>\n\/\/ Derecha-Clic &#8216;Tree Generic&#8217; cliente<br \/>\nMouse.Click(uITreeGenericClient, MouseButtons.Right, ModifierKeys.None, new Point(149, 9));<br \/>\n\/\/ Clic &#8216;Grupo nuevo&#8217; elemento de men\u00fa<br \/>\nMouse.Click(uIGruponuevoMenuItem, new Point(42, 13));<br \/>\nuITextBoxEdit.Text = sName;<br \/>\n\/\/ Clic &#8216;Aceptar&#8217; bot\u00f3n<br \/>\nMouse.Click(uIAceptarButton, new Point(49, 11));<br \/>\n}<br \/>\n\/\/\/<br \/>\n\/\/\/Obtiene o establece el contexto de las pruebas que proporciona<br \/>\n\/\/\/informaci\u00f3n y funcionalidad para la ejecuci\u00f3n de pruebas actual.<br \/>\n\/\/\/<br \/>\npublic TestContext TestContext<br \/>\n{<br \/>\nget<br \/>\n{<br \/>\nreturn testContextInstance;<br \/>\n}<br \/>\nset<br \/>\n{<br \/>\ntestContextInstance = value;<br \/>\n}<br \/>\n}<br \/>\nprivate TestContext testContextInstance;<br \/>\npublic UIMap UIMap<br \/>\n{<br \/>\nget<br \/>\n{<br \/>\nif ((this.map == null))<br \/>\n{<br \/>\nthis.map = new UIMap();<br \/>\n}<br \/>\nreturn this.map;<br \/>\n}<br \/>\n}<br \/>\nprivate UIMap map;<br \/>\n}<br \/>\npublic class SingletonRandom<br \/>\n{<br \/>\nprivate static SingletonRandom instance = null;<br \/>\nprivate Random oRandom;<br \/>\nprotected SingletonRandom()<br \/>\n{<br \/>\noRandom = new Random(unchecked((int)(DateTime.Now.Ticks)));<br \/>\n}<br \/>\npublic static SingletonRandom Instance<br \/>\n{<br \/>\nget<br \/>\n{<br \/>\nif (instance == null)<br \/>\ninstance = new SingletonRandom();<br \/>\nreturn instance;<br \/>\n}<br \/>\n}<br \/>\npublic Random getRandomObject()<br \/>\n{<br \/>\nreturn oRandom;<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>[\/csharp]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy en d\u00eda vivimos en un mundo cada vez m\u00e1s exigente, con mucha competencia y es vital entregar un producto software de forma r\u00e1pida y segura. Un error en cliente puede conllevar quedarse fuera del proyecto, por lo que el asegurar la calidad es algo fundamental, y se necesita por tanto una estrategia clara para<br \/><a href=\"https:\/\/fractaliasystems.com\/en\/pruebas-de-quality-assurance-qa-12\/\" class=\"more\">Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":2261,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-2260","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-fractalia"],"_links":{"self":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts\/2260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/comments?post=2260"}],"version-history":[{"count":1,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts\/2260\/revisions"}],"predecessor-version":[{"id":7152,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts\/2260\/revisions\/7152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/media\/2261"}],"wp:attachment":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/media?parent=2260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/categories?post=2260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/tags?post=2260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}