Marcos de Desarrollo Diseño e implementación de aplicaciones Web con .NET Objetivos Aprender a crear pruebas en Visual Studio con Test Project Test Project En .NET hay un tipo de proyecto específico para crear y automatizar la realización de pruebas Test Project Test Project Add > New Test Test Project Add > Unit Test Test Project Add > Unit Test Test Project Estructuras involucradas en el proceso de test, se identifican mediante atributos: [TestClass] [TestMethod] [ClassInitialize()] [ClassCleanup()] [TestInitialize()] [TestCleanup()] [ExpectedException(typeof(<Exception>))] Test Project Assert Permite establecer el estado de finalización de una prueba Opciones: AreEqual / AreNotEqual AreSame / AreNotSame IsTrue / IsFalse IsNull / IsNotNull IsInstanceOfType / IsNotInstanceOfType Fail Inconclusive Tests en MiniBank //Use ClassInitialize to run code before running the first test in the class [ClassInitialize()] public static void MyClassInitialize(TestContext testContext) { container = TestManager.ConfigureUnityContainer("unity"); accountService = container.Resolve<IAccountService>(); } //Use ClassCleanup to run code after all tests in a class have run [ClassCleanup()] public static void MyClassCleanup() { TestManager.ClearUnityContainer(container); } Tests en MiniBank //Use TestInitialize to run code before running each test [TestInitialize()] public void MyTestInitialize() { transaction = new TransactionScope(); } //Use TestCleanup to run code after each test has run [TestCleanup()] public void MyTestCleanup() { transaction.Dispose(); } Tests en MiniBank [TestMethod()] public void CreateAccountTest() { Account actual = accountService.CreateAccount( Account.CreateAccount(‐1, userId, balance)); Account expected = accountService.FindAccount(actual.accId); Assert.AreEqual(expected.usrId, actual.usrId); Assert.AreEqual(expected.balance, actual.balance, delta); } Tests en MiniBank /// <summary> ///Try to withdraw money from a non existent account ///</summary> [TestMethod()] [ExpectedException(typeof(InstanceNotFoundException))] public void WithdrawFromNonExistentAccountTest() { accountService.WithdrawFromAccount(NON_EXISTENT_ACCOUNT_ID, 10); } Tests en MiniPortal /// <summary> ///A test for FindUserProfileDetails ///</summary> [TestMethod()] public void FindUserProfileDetailsTest() { UserProfileDetails expected = new UserProfileDetails(firstName, lastName, email, language, country); long userId = userService.RegisterUser(loginName, clearPassword, expected); UserProfileDetails obtained = userService.FindUserProfileDetails(userId); // Check data Assert.AreEqual(expected, obtained); } Tests en MiniPortal namespace Es.Udc.DotNet.MiniPortal.Model { public partial class UserProfile { public override bool Equals(object obj) { UserProfile target = (UserProfile)obj; return (this.usrId == target.usrId) && (this.loginName == target.loginName) && (this.enPassword == target.enPassword) && (this.firstName == target.firstName) && (this.lastName == target.lastName) && (this.email == target.email) && (this.language == target.language) && (this.country == target.country); } public override int GetHashCode() { return this.usrId.GetHashCode(); } ... Ejecución de los Tests Menú > Test > Windows > Test List Editor Ejecución de los Tests Menú > Test > Windows > Test View Ejecución de los Tests Los resultados se muestran en la ventana de Test Results Pruebas de Unidad Ciclo de vida A inicio de la ejecución de pruebas Creación de instancia unit test runner Test runner crea una sesión de test (test fixture) y obtiene por reflexión los atributos de test Se crea/recupera un test context esta instancia existe durante la totalidad de la sesión de test Se llaman los métodos de inicialización del assembly y de la clase: AssemblyIntitialize y ClassInitialize. Pruebas de Unidad Ciclo de vida Para cada método de test, se sigue el siguiente procedimiento: Se recupera una instancia de la sesión de test (test fixture) Se copia el contexto en la instancia de sesión Se llama el método de inicialización método con el atributo TestInitialize El método que se desea probar se invoca Se llama al método testCleanup método con el atributo TestCleanup Pruebas de Unidad Ciclo de vida Una vez ejecutados todos los tests: Se llama al método classCleanup método estático con el atributo ClassCleanup de la clase Se llama al método assemblyCleanup método estático con el atributo AssemblyCleanup Si durante cualquier fase del ciclo de vida de un test se produce una excepción, el test termina con un fallo