Ejecutar multiples instancias de Apache como Servicio

|

Primero como verán, este blog ya no es mas de solo .NET, ahora sera agnóstico, pondré temas y temas de lo que vaya haciendo, que últimamente me ha resultado interesante, como por ejemplo la necesidad de correr dos instancias de Apache Tomcat 6 en Windows, pero las dos como servicios, para esto me encontré con un link que fue de mucha ayuda:

http://www.vicconsult.com/tips/apache-tomcat-load-balance-miltiple-instances-ha.html

Y basado en la información de ahí, logre generar este comando:

tomcat6 //IS//Tomcat6 --DisplayName="Apache Tomcat 6 Alter" --Install="d:\apache2\bin\tomcat6.exe" --Jvm=auto --StartMode=jvm --StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop

Pero que pasos se deben dar? Aqui una lista:

1. Instala Apache Tomcat 6, e incluye la opción de Servicio cuando escojas los componentes, recuerda que es mejor instalar en una carpeta con nombre sin espacios y de una longitud corta.
2. Instala la segunda instancia de Apache Tomcat 6, en una carpeta diferente claro, pero con la misma opción de instalar el servicio, esta vez dará un error, da click en omitir, el error indica que no puede instalar dos veces el mismo servicio, lo cual claro no es cierto, recuerda cambia de puerto esta segunda instancia!
3. Ejecuta en la carperta bin de la segunda instancia de apache el comando de arriba, cambiando el parametro Install por el nombre de la carpeta correcta para tu instalacion, y si quieres el Dysplayname por algo que te ayude a identificar el servicio.
5. En la administracion de servicios de Windows, revisa tu servicio, buscalo por el nombre que pusiste en Displayname, dale Iniciar o Start, y listo!

Con estos pasos he podido ejecutar mas de una instancia de Apache Tomcat 6 como servicio en una maquina Windows....

Espero que les sirva!

Ejemplo de pruebas Unitarias

|

El siguiente código es un ejemplo de como se pueden crear pruebas unitarias con un framework de pruebas para reflejar casos de pruebas en un proyecto de desarrollo de software:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

[TestMethod]

public void PruebaObtenerOpcionesMenuParaUsuarioAdministrador()

{

//Se fijan los parametros requeridos para las pruebas

string strUsuario = "Administrador";

string strPassword = "Password";

string strNombreOpcion = "ReporteAspirantesIdoneos";

//Se fijan los resultados esperados

var ResultadoAutenticarEsperado = true;

//Se obtiene el resultado de la primera operación

var ResultadoautenticarObtenido =

eRecruit.Logic.clsNegocio.Autenticar(strUsuario, strPassword);

//Se comparan los resultados, de no coincidir se notifica con un mensaje

Assert.AreEqual(

ResultadoautenticarObtenido,

ResultadoAutenticarEsperado,

"Ha fallado la autenticacion del Usuario");

//Se fijan los resultados esperados en la segunda operación

var ResultadoEsperadoOpciones = true;

//Se obtiene la lista que contiene los datos para buscar la opción esperada

var ListadoOpciones = eRecruit.Logic.clsNegocio.ObtenerOpcionesMenu(strUsuario);

//Se busca si existe la opción esperada

var ResultadoObtenidoOpciones =

ListadoOpciones.Any(lst => lst.Nombre == strNombreOpcion);

//Se compara el resultado de la búsqueda con el resultado esperado

//si falla se notifica con un mensaje de error

Assert.AreEqual(

ResultadoObtenidoOpciones,

ResultadoEsperadoOpciones,

"El usuario no tiene acceso a la opción de generación del reporte");

}

[TestMethod]

public void PruebaGenerarReporteAspirantesIdoneos()

{

//Se fijan los parametros

string strDescripcionProceso = "SISTEMAS01";

//Se obtiene un resultado intermedio

var ProcesoSeleccion =

eRecruit.Logic.clsNegocio.ObtenerProcesoSeleccion(strDescripcionProceso);

//Se obtiene el listado de aspirantes aprobados para el proceso seleccionado

var ListadoAprobado =

eRecruit.Logic.clsNegocio.ObtenerAspirantesIdoneos(ProcesoSeleccion.IdProceso);

//Se compara si el proceso devolvio al menos un aspirante aprobado

//si no existen aprobados se notifica con un mensaje de error

Assert.AreNotEqual(

ListadoAprobado.Any,

true,

"No existen aspirantes aprobado para el proceso");

//Se genera el reporte, el metodo devuelve el path del reporte generado

var PathReporte =

eRecruit.Logic.clsNegocio.GenerarReporteAspirantesAceptados(ListadoAprobado);

//Se verifica que el Path no sea vacio

// de lo contrario se notifica un error

Assert.IsFalse(

String.IsNullOrEmpty(PathReporte),

"No se ha devuelto un path correcto");

}

[TestMethod]

public void PruebaPublicarResultadosPruebas()

{

//Se fijan los parametros

string strPathReporte = "~/reportes/plantillaaceptados.pdf";

string strTituloReporte = "Reporte de Aspirantes Aprobados";

//Se fija el resultado esperado

bool ResultadoPublicacionEsperado = true;

//Se obtiene el resultado del proceso

bool ResultadoPublicacionObtenido =

eRecruit.Logic.clsNegocio.PublicarReporte(strTituloReporte, strPathReporte);

//Se comparan los resultados esperados y obtenido

//si no coincide se notifica con un error

Assert.AreEqual(

ResultadoPublicacionObtenido,

ResultadoPublicacionEsperado,

"No se ha ejecutado la publicación del reporte");

}

[TestMethod]

public void PruebaGenerarNotificacionesResultadosAspirantes()

{

//Se fijan los parametros

string strDescripcionProceso = "SISTEMAS01";

//Se obtiene un resultado intermedio

var ProcesoSeleccion =

eRecruit.Logic.clsNegocio.ObtenerProcesoSeleccion(strDescripcionProceso);

//Se obtiene el listado de aspirantes aprobados para el proceso seleccionado

var ListadoAprobado =

eRecruit.Logic.clsNegocio.ObtenerAspirantesIdoneos(ProcesoSeleccion.IdProceso);

//Se compara si el proceso devolvio al menos un aspirante aprobado

//si no existen aprobados se notifica con un mensaje de error

Assert.AreNotEqual(

ListadoAprobado.Any,

true,

"No existen aspirantes aprobado para el proceso");

//Se establece el resultado esperado

bool ResultadoNotificacionEsperado = true;

//Se obtiene el resultado del proceso

bool ResultadoNotificacionObtenido =

eRecruit.Logic.clsNegocio.GenerarNotificacionesAspirantes(

ListadoAprobado,

eRecruit.Logic.Enumeraciones.Aceptado);

//Se comparan los resultados obtenidos con los esperados

//si no coinciden se notifica con un error

Assert.AreEqual(

ResultadoNotificacionObtenido,

ResultadoNotificacionEsperado,

"No se han generado las notificaciones correctamente");

}

[TestMethod]

public void PruebaPublicacionRevisionResultados()

{

//Paso 1 del caso de prueba

PruebaObtenerOpcionesMenuParaUsuarioAdministrador();

//Paso 2 del caso de prueba

PruebaGenerarReporteAspirantesIdoneos();

//Paso 3 del caso de prueba

PruebaPublicarResultadosPruebas();

//Paso 4 del caso de prueba

PruebaGenerarNotificacionesResultadosAspirantes();

}

Nota: El código aquí expuesto funciona con la herramienta de pruebas de Visual Studio Team Tester y se desarrollo en lenguaje C#, se pueden usar otros frameworks para pruebas como NUnit u otros disponibles según la conveniencia de cada equipo de desarrollo para desarrollar las pruebas, además las líneas al lado del código tienen el propósito de ser referencia.

Como se puede ver en el ejemplo, en las líneas 2, 37, 68 y 89 se encuentran los métodos que representan a las pruebas funcionales, cada uno usa la técnica de pruebas unitarias para verificar los resultados, cada uno de los métodos representa un paso del caso de pruebas, además en la línea 124 está el método que representa a todo el caso de prueba, que ejecuta en el mismo orden los métodos que representan a los pasos del caso de uso. En caso de fallar uno de los métodos se entiende que el caso de prueba ha fallado, y debe ser enviado de nuevo a revisión al equipo de desarrollo.