Ir al contenido principal

Primeros ajustes en la plataforma de testeo


Ya tenía muchas ganas de poner a prueba nuestra recién desarrollada plataforma para Test, pero me di cuenta de que necesitaba unos cuantos ajustes antes de ponerla en marcha.

Os recuerdo que todo el código está disponible en Enigma Software - ZM LABS

He habilitado un menú en las ramas secundarias del TreeView para grabar un nuevo test:


Para que solo se despliegue en las ramas secundarias de tipo "Categoría" programo el evento Opening del Menú:

        private void contextMenuArbol_Opening(object sender, CancelEventArgs e)
        {
            if (treeCatalogo.SelectedNode != null)
            {
                objects.treeElement _treeelem = (objects.treeElement)treeCatalogo.SelectedNode.Tag;

                if (_treeelem.ElemType == objects.enumElemType.Categorie && _treeelem.Categorie.categorie_dad != null)
                {
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

Menú que conduce a la grabación de un nuevo test:


En el campo Clase hemos de dar el mismo nombre que tendrá la clase de negocio que ejecute el test:


Al seleccionar un test mostramos una pantalla con la información del mismo, desde la cual podremos lanzar la ejecución. ¿Cómo? Llegamos a la parte más bonita.


A la pantalla de la imagen le pasamos ya la información necesaria para ello, recogida en la propiedad TAG del nodo seleccionado:

        private void treeCatalogo_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (treeCatalogo.SelectedNode != null)
            {
                objects.treeElement _treeelem = (objects.treeElement)treeCatalogo.SelectedNode.Tag;

                if (_treeelem.ElemType == objects.enumElemType.Test)
                {
                    _pantalla_actual = enumPantalla.TestInfo;

                    _test_functions.SetTestObject(_treeelem.TestObject);

                    try
                    {
                        enumTestTypes _type = (enumTestTypes)Enum.Parse(typeof(enumTestTypes),
                                                                        _treeelem.TestObject.classname);
                         
                        _treeelem.TestObject.execution.ClassName = _treeelem.TestObject.classname;
                        _treeelem.TestObject.execution.TestType = _type;

                        _treeelem.TestObject.execution.OBJ = test_types.GetObject(_test_functions, _type);

                        _ctrl_test_info = new controls.usrctrl_testinfo(_treeelem.TestObject);

                        splitContainer.Panel2.Controls.Clear();
                        splitContainer.Panel2.Controls.Add(_ctrl_test_info);
                    }
                    catch (Exception ex)
                    {
                        splitContainer.Panel2.Controls.Clear();
                    }
                }
                else
                {
                    splitContainer.Panel2.Controls.Clear();
                }
            }
        }

La clave para después poder ejecutar esta clase se encuentra en la propiedad execution.OBJ

_treeelem.TestObject.execution.OBJ = test_types.GetObject(_test_functions, _type);

Permítanme enseñarles el código de la clase test_types que contiene el método GetObject,
ya que este es el que devuelve un objeto de negocio adecuado al Test seleccionado.



    public static class test_types
    {
        public class mensajes
        {
            public Guid id;
            public string mensaje;
            public bool leido;
        }

        public enum enumEstadoProceso { Parado, Ejecutando, Finalizado, Erroneo }

        public static Object GetObject(test_functions _functions, ZmLabsObjects.enumTestTypes _type)
        {
            Object res = new Object();

            switch (_type)
            {
                case ZmLabsObjects.enumTestTypes.test1_multithreading_sleep_performance:

                    res = new test1_multithreading_sleep_performance(_functions);
                    break;
            }

            return res;
        }
    }

Muy importante señalar que en próximas publicaciones iremos aplicando significativas mejoras sobre el código que hoy les estoy mostrando. No pretende ésta ser una plataforma estática, sino una excusa para ir evolucionando y aprendiendo siempre de la mano de Uds. queridos lectores.

Al pulsar el botón PLAY en el formulario cargamos un control de usuario, que será el que ejecute la clase de negocio, y muestre los mensajes que la propia clase vaya generando.

    public partial class usrctrl_monitorlist : UserControl
    {
        public static test_functions _testobject;
        public static test_types.enumEstadoProceso _estadoProceso;

        public usrctrl_monitorlist()
        {
            InitializeComponent();
        }

        public void Activate(test_functions p_testobject)
        {
            _testobject = p_testobject;
            _estadoProceso = test_types.enumEstadoProceso.Parado;

            Thread _th = new Thread(() => HiloNegocio());
            _th.Start();

            Thread.Sleep(3000);

            timerControl.Enabled = true;
        }

        private void timerControl_Tick(object sender, EventArgs e)
        {
            List<test_types.mensajes> lstMensajes = new List<test_types.mensajes>();

            switch (_testobject.execution.TestType)
            {
                case enumTestTypes.test1_multithreading_sleep_performance:

                    var obj = (test1_multithreading_sleep_performance)_testobject.execution.OBJ;

                    _estadoProceso = obj.Estado;
                    lstMensajes = obj.Mensajes.Where(msg => msg.leido == false).ToList();

                    foreach (var msg in lstMensajes)
                    {
                        obj.SetMsgLeido(msg.id);
                    } 

                    break;
            }

            if (_estadoProceso == test_types.enumEstadoProceso.Ejecutando)
            {
                foreach (var msg in lstMensajes)
                {
                    ListViewItem lstIt = new ListViewItem(msg.mensaje);
                    lstMonitor.Items.Add(lstIt);
                }
            }
            else if (_estadoProceso == test_types.enumEstadoProceso.Finalizado)
            {
                timerControl.Enabled = false;

                //última lectura de mensajes
                foreach (var msg in lstMensajes)
                {
                    ListViewItem lstIt = new ListViewItem(msg.mensaje);
                    lstMonitor.Items.Add(lstIt);
                }
            }
        }

        public static void HiloNegocio()
        {
            switch (_testobject.execution.TestType)
            {
                case enumTestTypes.test1_multithreading_sleep_performance:

                    var obj = (test1_multithreading_sleep_performance)_testobject.execution.OBJ;
                    obj.Start();

                    break;
            }
        }
    }

Con estas mejoras sobre la plataforma ya podemos ir generando y ejecutando los TEST.

En el próximo POST   ¡¡por fin podremos ver la primera ejecución!!





Comentarios

Entradas populares de este blog

Test 3: ¿Son eficientes los ORMs?

Bienvenidos amigos. Me complace anunciar que por fin estrenamos la categoría " SQL Server Tips ", y lo hacemos por todo lo alto, entrando de lleno en un aspecto altamente polémico entre programadores. ¿Es eficiente un ORM en los accesos a datos? Ya conocen la filosofía de nuestros Tests, no vamos a teorizar demasiado, pero sí una pequeña base va a ser necesaria para conseguir una buena respuesta a nuestra pregunta. He leído un interesante  artículo de nuestros súper amigos de Deloitte ( cuando usar ORM ) argumentando que el uso o no de un ORM hay que decidirlo en relación a la complejidad de nuestro modelo de datos, y al rendimiento que requeriremos en nuestras soluciones, pero, ¿cuándo no deseamos el mejor rendimiento para nuestro software? Lo cierto es que, como ya hemos visto, el ORM facilita mucho las cosas, aporta claridad al código, de eso no cabe duda, pero, ¿es eficiente? He ahí la cuestión. Sobre este asunto vamos a poner a funcionar nuestros apreciados Test. C

Proyecto GEOW. Implementando el patrón CQRS. 2ª parte

En el anterior post ( Proyecto GEOW. Implementando el patrón CQRS ) nos adentramos en el funcionamiento del proyecto GEOW que nos va a servir de base para implementar un patrón arquitectónico, CQRS , pensado para dar respuesta a sistemas con alta exigencia de lecturas y escrituras simultáneas. Para ello hemos creado una interfaz gráfica con una serie de figuras geométricas en movimiento. Ahora vamos a ir a la parte de EL DATO. Cada vez que uno de estos cuadrados cambia de posición envía una trama con sus propias características, y sus nuevas coordenadas. Cada uno de los cuadrados realiza un movimiento cada 300 milisegundos, y he llegado a probar con hasta unas 700 figuras. En estos niveles el software empieza a sufrir, pero más la parte gráfica. Aparentemente el sistema de grabación de coordenadas se mantiene en buena forma. Vamos a ver, precisamente, este sistema de grabación: Grabando lotes de coordenadas en BBDD En el objeto PointObj que representa cada una de las figuras, en el

Primeros pasos en Enigma Software Labs

En pocas palabras: vamos a probar y estresar distintas soluciones de software para un mismo problema, en busca de realidades matemáticas. Para ello, lo primero que necesitamos en averiguar el modo de publicar código aquí en Blogger . Para ello voy a usar un sistema súper sencillo y eficiente. Ahí va un ejemplo de código C# private void frmMonitor_Load ( object sender, EventArgs e) { TreeNode _tr = new TreeNode( "SQL Server Tips" ); TreeNode _tr2 = new TreeNode( "C# Code" ); treeCatalogo.Nodes.Add(_tr); treeCatalogo.Nodes.Add(_tr2); //splitContainer.Panel1.Focus(); //lstMonitor.Focus(); } Hilarante ¿verdad?   hilite.me  lo hace posible. Bien, paso 2, fácil y sencillo: vamos a crear una plataforma de testeo para C# en una bonita solución que compartiré en el repositorio GIT, para disfrute de todos. Enigma Software - ZM LABS Como posteriormente me dive