Resistance is futile mocks will be assimilated
Upcoming SlideShare
Loading in...5
×
 

Resistance is futile mocks will be assimilated

on

  • 4,356 views

Conference given at Codemotion Madrid 2013 about writing tests not only using mocks.

Conference given at Codemotion Madrid 2013 about writing tests not only using mocks.

Statistics

Views

Total Views
4,356
Slideshare-icon Views on SlideShare
1,505
Embed Views
2,851

Actions

Likes
6
Downloads
28
Comments
0

13 Embeds 2,851

http://java.dzone.com 1470
http://www.lordofthejars.com 1309
http://librosweb.es 32
https://twitter.com 16
http://architects.dzone.com 7
http://www.directrss.co.il 4
http://www.newsblur.com 4
http://translate.googleusercontent.com 2
http://feedly.com 2
http://www.dzone.com 2
http://newsblur.com 1
http://overdescant12.rssing.com 1
http://19517292_d597b188943e01ae837ad58e70a14fd462d30317.blogspot.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Resistance is futile mocks will be assimilated Resistance is futile mocks will be assimilated Presentation Transcript

    • Alex Soto Resistance is Futile, Mocks Will be Assimilated asotobu@gmail.com - Everis viernes 18 de octubre de 13
    • Mocks ? Alex Soto Mocks are objects preprogrammed with expectations viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Mocks ? Alex Soto Mocks are objects preprogrammed with expectations viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Mocks ? Alex Soto Fast viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Mocks ? Alex Soto Fast Interface viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Mocks ? Alex Soto Fast Interface viernes 18 de octubre de 13 www.lordofthejars - @alexsotob 70% Test Code
    • Mocks ? Alex Soto Fast Interface viernes 18 de octubre de 13 www.lordofthejars - @alexsotob 70% Test Code Hard to Maintain
    • Mocks ? Alex Soto Fast Interface www.lordofthejars - @alexsotob 70% Test Code Hard to Maintain Container services viernes 18 de octubre de 13
    • Mocks ? Alex Soto Fast Interface www.lordofthejars - @alexsotob 70% Test Code Hard to Maintain Container services Uncertainty viernes 18 de octubre de 13
    • Mocks ? Alex Soto Fast Interface www.lordofthejars - @alexsotob 70% Test Code Hard to Maintain Container services Uncertainty Duplication viernes 18 de octubre de 13
    • Mocks ? Kn ow En Y em ou y? r Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Java EE Scenario Alex Soto www.lordofthejars - @alexsotob {text/html} {app/json} {app/xml} {app/json} Client viernes 18 de octubre de 13 Protocol Server External
    • High Level Tests Alex Soto www.lordofthejars - @alexsotob e e W viernes 18 de octubre de 13 D ’t on im T ve a H
    • Low Level Tests Alex Soto State Of The Union viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Mock DAOs viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Mock DAOs Fast Isolated viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Mock DAOs Fast Isolated ORM Mapping ORM Configuration Queries viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Fast viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Fast viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Fast viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Isolated viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Isolated viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob Isolated Define base data set viernes 18 de octubre de 13 CLEAN INSERT
    • Data Layer Alex Soto www.lordofthejars - @alexsotob { ! ! ! ! } "Book": ! ! [ ! ! ! ! ! ] {"title":"The Hobbit","numberOfPages":293} @Rule public MongoDbRule remoteMongoDbRule = newMongoDbRule().defaultManagedMongoDb("db"); @Test @UsingDataSet(locations="data.json",loadStrategy=LoadStrategyEnum.CL EAN_INSERT) @ShouldMatchDataSet(location="expectedData.json") public void book_should_be_inserted_into_repository() { //test } viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob { ! ! ! ! } "Book": ! ! [ ! ! ! ! ! ] {"title":"The Hobbit","numberOfPages":293} @Rule public MongoDbRule remoteMongoDbRule = newMongoDbRule().defaultManagedMongoDb("db"); @Test @UsingDataSet(locations="data.json",loadStrategy=LoadStrategyEnum.CL EAN_INSERT) @ShouldMatchDataSet(location="expectedData.json") public void book_should_be_inserted_into_repository() { //test } viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob { ! ! ! ! } "Book": ! ! [ ! ! ! ! ! ] {"title":"The Hobbit","numberOfPages":293} @Rule public MongoDbRule remoteMongoDbRule = newMongoDbRule().defaultManagedMongoDb("db"); @Test @UsingDataSet(locations="data.json",loadStrategy=LoadStrategyEnum.CL EAN_INSERT) @ShouldMatchDataSet(location="expectedData.json") public void book_should_be_inserted_into_repository() { //test } viernes 18 de octubre de 13
    • Data Layer Alex Soto www.lordofthejars - @alexsotob { ! ! ! ! } "Book": ! ! [ ! ! ! ! ! ] {"title":"The Hobbit","numberOfPages":293} @Rule public MongoDbRule remoteMongoDbRule = newMongoDbRule().defaultManagedMongoDb("db"); @Test @UsingDataSet(locations="data.json",loadStrategy=LoadStrategyEnum.CL EAN_INSERT) @ShouldMatchDataSet(location="expectedData.json") public void book_should_be_inserted_into_repository() { //test } viernes 18 de octubre de 13
    • E-mail Alex Soto www.lordofthejars - @alexsotob Mock E-mail access viernes 18 de octubre de 13
    • E-mail Alex Soto www.lordofthejars - @alexsotob Mock E-mail access Fast Offline viernes 18 de octubre de 13
    • E-mail Alex Soto www.lordofthejars - @alexsotob Mock E-mail access Fast Offline javax.mail viernes 18 de octubre de 13
    • E-mail Alex Soto www.lordofthejars - @alexsotob SMTPMailService.sendMail(MailMessageBuilder$MailMessage) Transport.send(Message) Transport.send0(Message, Address[]) SMTPTransport.sendMessage(Message, Address[]) MimeMessage.writeTo(OutputStream, String[]) MimeBodyPart.writeTo(MimePart, OutputStream, String[]) viernes 18 de octubre de 13
    • E-mail Alex Soto www.lordofthejars - @alexsotob Embeddable SMTP server viernes 18 de octubre de 13
    • E-mail Alex Soto www.lordofthejars - @alexsotob private static final int SMTP_PORT = 2500; private static Wiser mailServer = new Wiser(); @BeforeClass public static void startWiser() { ! mailServer.setPort(SMTP_PORT); ! mailServer.start(); } @AfterClass public static void stopWiser() { ! mailServer.stop(); } @Test public void an_email_should_be_sent() throws MessagingException, IOException { ! ! ! ! ! ! SMTPMailService smtpMailService = getMailService(); smtpMailService.sendMail(message); ! ! ! ! } viernes 18 de octubre de 13 MailMessage message = mail().from("me@mail.com").addTo("you@mail.com") ! ! ! .contentType("text/plain").subject("Welcome") ! ! ! .body("Welcome to our site, thanks for registering on it.") ! ! ! .build(); WiserMessage sentMessage = getSentMessage(); ! String subject = sentMessage.getMimeMessage().getSubject(); assertThat(subject, is("Welcome"));! !
    • E-mail Alex Soto www.lordofthejars - @alexsotob private static final int SMTP_PORT = 2500; private static Wiser mailServer = new Wiser(); @BeforeClass public static void startWiser() { ! mailServer.setPort(SMTP_PORT); ! mailServer.start(); } @AfterClass public static void stopWiser() { ! mailServer.stop(); } @Test public void an_email_should_be_sent() throws MessagingException, IOException { ! ! ! ! ! ! SMTPMailService smtpMailService = getMailService(); smtpMailService.sendMail(message); ! ! ! ! } viernes 18 de octubre de 13 MailMessage message = mail().from("me@mail.com").addTo("you@mail.com") ! ! ! .contentType("text/plain").subject("Welcome") ! ! ! .body("Welcome to our site, thanks for registering on it.") ! ! ! .build(); WiserMessage sentMessage = getSentMessage(); ! String subject = sentMessage.getMimeMessage().getSubject(); assertThat(subject, is("Welcome"));! !
    • E-mail Alex Soto www.lordofthejars - @alexsotob private static final int SMTP_PORT = 2500; private static Wiser mailServer = new Wiser(); @BeforeClass public static void startWiser() { ! mailServer.setPort(SMTP_PORT); ! mailServer.start(); } @AfterClass public static void stopWiser() { ! mailServer.stop(); } @Test public void an_email_should_be_sent() throws MessagingException, IOException { ! ! ! ! ! ! SMTPMailService smtpMailService = getMailService(); smtpMailService.sendMail(message); ! ! ! ! } viernes 18 de octubre de 13 MailMessage message = mail().from("me@mail.com").addTo("you@mail.com") ! ! ! .contentType("text/plain").subject("Welcome") ! ! ! .body("Welcome to our site, thanks for registering on it.") ! ! ! .build(); WiserMessage sentMessage = getSentMessage(); ! String subject = sentMessage.getMimeMessage().getSubject(); assertThat(subject, is("Welcome"));! !
    • E-mail Alex Soto www.lordofthejars - @alexsotob private static final int SMTP_PORT = 2500; private static Wiser mailServer = new Wiser(); @BeforeClass public static void startWiser() { ! mailServer.setPort(SMTP_PORT); ! mailServer.start(); } @AfterClass public static void stopWiser() { ! mailServer.stop(); } @Test public void an_email_should_be_sent() throws MessagingException, IOException { ! ! ! ! ! ! SMTPMailService smtpMailService = getMailService(); smtpMailService.sendMail(message); ! ! ! ! } viernes 18 de octubre de 13 MailMessage message = mail().from("me@mail.com").addTo("you@mail.com") ! ! ! .contentType("text/plain").subject("Welcome") ! ! ! .body("Welcome to our site, thanks for registering on it.") ! ! ! .build(); WiserMessage sentMessage = getSentMessage(); ! String subject = sentMessage.getMimeMessage().getSubject(); assertThat(subject, is("Welcome"));! !
    • REST Alex Soto www.lordofthejars - @alexsotob Mock REST access viernes 18 de octubre de 13
    • REST Alex Soto www.lordofthejars - @alexsotob Mock REST access Fast Offline viernes 18 de octubre de 13
    • REST Alex Soto www.lordofthejars - @alexsotob Mock REST access Fast Offline Full Call Stack viernes 18 de octubre de 13
    • REST Alex Soto www.lordofthejars - @alexsotob Stubbing Web Services viernes 18 de octubre de 13
    • REST Alex Soto www.lordofthejars - @alexsotob private static final String URL = "http://localhost:8089"; @Rule public WireMockRule wireMockRule = new WireMockRule(8089); ! @Test public void issues_from_project_should_be_retrieved() { ! ! ! givenThat(get(urlEqualTo("/repos/lordofthejars/nosqlunit/issues")) ! ! .willReturn(aResponse() .withHeader("Content-Type", "application/json") .withBody(GET_RESPONSE_JSON)) ! ); ! ! ! GithubClient githubClient = new GithubClient(URL); ! ! ! String issues = githubClient.invokeGetMethod("/repos/lordofthejars/ nosqlunit/issues"); ! ! } viernes 18 de octubre de 13 //could be an object assertThat(issues, is(GET_RESPONSE_JSON)); !
    • REST Alex Soto www.lordofthejars - @alexsotob private static final String URL = "http://localhost:8089"; @Rule public WireMockRule wireMockRule = new WireMockRule(8089); ! @Test public void issues_from_project_should_be_retrieved() { ! ! ! givenThat(get(urlEqualTo("/repos/lordofthejars/nosqlunit/issues")) ! ! .willReturn(aResponse() .withHeader("Content-Type", "application/json") .withBody(GET_RESPONSE_JSON)) ! ); ! ! ! GithubClient githubClient = new GithubClient(URL); ! ! ! String issues = githubClient.invokeGetMethod("/repos/lordofthejars/ nosqlunit/issues"); ! ! } viernes 18 de octubre de 13 //could be an object assertThat(issues, is(GET_RESPONSE_JSON)); !
    • REST Alex Soto www.lordofthejars - @alexsotob private static final String URL = "http://localhost:8089"; @Rule public WireMockRule wireMockRule = new WireMockRule(8089); ! @Test public void issues_from_project_should_be_retrieved() { ! ! ! givenThat(get(urlEqualTo("/repos/lordofthejars/nosqlunit/issues")) ! ! .willReturn(aResponse() .withHeader("Content-Type", "application/json") .withBody(GET_RESPONSE_JSON)) ! ); ! ! ! GithubClient githubClient = new GithubClient(URL); ! ! ! String issues = githubClient.invokeGetMethod("/repos/lordofthejars/ nosqlunit/issues"); ! ! } viernes 18 de octubre de 13 //could be an object assertThat(issues, is(GET_RESPONSE_JSON)); !
    • REST Alex Soto www.lordofthejars - @alexsotob private static final String URL = "http://localhost:8089"; @Rule public WireMockRule wireMockRule = new WireMockRule(8089); ! @Test public void issues_from_project_should_be_retrieved() { ! ! ! givenThat(get(urlEqualTo("/repos/lordofthejars/nosqlunit/issues")) ! ! .willReturn(aResponse() .withHeader("Content-Type", "application/json") .withBody(GET_RESPONSE_JSON)) ! ); ! ! ! GithubClient githubClient = new GithubClient(URL); ! ! ! String issues = githubClient.invokeGetMethod("/repos/lordofthejars/ nosqlunit/issues"); ! ! } viernes 18 de octubre de 13 //could be an object assertThat(issues, is(GET_RESPONSE_JSON)); !
    • Container Alex Soto Code Runs in Container viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto www.lordofthejars - @alexsotob Code Runs in Container CDI (Qualifiers, Produces, Alternatives, Decorators) JPA (EntityManager, Transactions, Mapping) Security JSF (Conversation Scope, Binding,Validation) JAX-RS, JAX-WS, ... viernes 18 de octubre de 13
    • Container Alex Soto www.lordofthejars - @alexsotob public class PaymentGateway { @Inject @CreditCard PaymentProcessor paymentProcessor //... public void setPaymentProcessor(PaymentProcessor paymentProcessor) {...} } Are you sure it works? viernes 18 de octubre de 13
    • Container Alex Soto Brings tests to runtime viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto Brings tests to runtime Manage Lifecycle of Container viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto www.lordofthejars - @alexsotob Brings tests to runtime Manage Lifecycle of Container Create/Deploy MicroDeployments viernes 18 de octubre de 13
    • Container Alex Soto www.lordofthejars - @alexsotob Brings tests to runtime Manage Lifecycle of Container Create/Deploy MicroDeployments Enriching Test Classes viernes 18 de octubre de 13
    • Container Alex Soto www.lordofthejars - @alexsotob Brings tests to runtime Manage Lifecycle of Container Create/Deploy MicroDeployments Enriching Test Classes Run Tests Inside/Against Container viernes 18 de octubre de 13
    • Container Alex Soto www.lordofthejars - @alexsotob Brings tests to runtime Manage Lifecycle of Container Create/Deploy MicroDeployments Enriching Test Classes Run Tests Inside/Against Container IDE Friendly viernes 18 de octubre de 13
    • Container Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Alex Soto Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Container Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Slide’s title Speaker’s name Let’s see in Action viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • UI Alex Soto www.lordofthejars - @alexsotob UI code DOM Manipulation Ajax Widgets viernes 18 de octubre de 13
    • UI Alex Soto www.lordofthejars - @alexsotob Drives the browser Access web elements viernes 18 de octubre de 13
    • UI Alex Soto www.lordofthejars - @alexsotob driver.get(contextPath.toString()+"login.xhtml"); ! ! WebElement username = driver.findElement(By.id("username")); WebElement password = driver.findElement(By.id("password")); WebElement submit = driver.findElement(By.id("submit")); ! ! username.sendKeys("aa"); password.sendKeys("bb"); ! ! submit.click(); ! ! WebElement welcomeMessage = driver.findElement(By.id("welcomeMessage")); assertThat(welcomeMessage.getText(), is("Welcome")); viernes 18 de octubre de 13
    • UI Alex Soto www.lordofthejars - @alexsotob driver.get(contextPath.toString()+"login.xhtml"); ! ! WebElement username = driver.findElement(By.id("username")); WebElement password = driver.findElement(By.id("password")); WebElement submit = driver.findElement(By.id("submit")); ! ! username.sendKeys("aa"); password.sendKeys("bb"); ! ! submit.click(); ! ! WebElement welcomeMessage = driver.findElement(By.id("welcomeMessage")); assertThat(welcomeMessage.getText(), is("Welcome")); viernes 18 de octubre de 13
    • UI Alex Soto www.lordofthejars - @alexsotob Arquillian Drone/Graphene Sexy WebDriver API Ajax-enabled PageObjects JQuery selectors Call Javascript as Java viernes 18 de octubre de 13
    • UI Alex Soto Let’s see in Action viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Faults Alex Soto www.lordofthejars - @alexsotob Mock Fauls viernes 18 de octubre de 13
    • Faults Alex Soto www.lordofthejars - @alexsotob Mock Fauls Race Conditions Uncommon Exceptions viernes 18 de octubre de 13
    • Faults Alex Soto www.lordofthejars - @alexsotob Mock Fauls Race Conditions Uncommon Exceptions Test Until Last Line viernes 18 de octubre de 13
    • Faults Alex Soto www.lordofthejars - @alexsotob Fault Injection Modify Bytecode viernes 18 de octubre de 13
    • Faults Alex Soto www.lordofthejars - @alexsotob @Test(expected = ”IOException.class”) @BMRule( ! ! name="throw IOException writting content", ! ! targetClass = "com.lordofthejars.byteman.util.FileUtils", ! ! targetMethod = "createFileWithContent", ! ! targetLocation = "CALL BufferedWriter.write(String)", ! ! action = "throw new java.io.IOException()" ! ! ) public void an_exception_should_be_thrown() throws IOException { ! ! ! BackupManager backupManager = createBackupManager();! ! ! backupManager.backupData("Hello World"); ! ! } public void createFileWithContent(File filename, String content) throws IOException { ! ! } viernes 18 de octubre de 13 ! ! ! ! BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(content);
    • Faults Alex Soto www.lordofthejars - @alexsotob @Test(expected = ”IOException.class”) @BMRule( ! ! name="throw IOException writting content", ! ! targetClass = "com.lordofthejars.byteman.util.FileUtils", ! ! targetMethod = "createFileWithContent", ! ! targetLocation = "CALL BufferedWriter.write(String)", ! ! action = "throw new java.io.IOException()" ! ! ) public void an_exception_should_be_thrown() throws IOException { ! ! ! BackupManager backupManager = createBackupManager();! ! ! backupManager.backupData("Hello World"); ! ! } public void createFileWithContent(File filename, String content) throws IOException { ! ! } viernes 18 de octubre de 13 ! ! ! ! BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(content);
    • Faults Alex Soto www.lordofthejars - @alexsotob @Test(expected = ”IOException.class”) @BMRule( ! ! name="throw IOException writting content", ! ! targetClass = "com.lordofthejars.byteman.util.FileUtils", ! ! targetMethod = "createFileWithContent", ! ! targetLocation = "CALL BufferedWriter.write(String)", ! ! action = "throw new java.io.IOException()" ! ! ) public void an_exception_should_be_thrown() throws IOException { ! ! ! BackupManager backupManager = createBackupManager();! ! ! backupManager.backupData("Hello World"); ! ! } public void createFileWithContent(File filename, String content) throws IOException { ! ! } viernes 18 de octubre de 13 ! ! ! ! BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(content);
    • Continuous Integration/Delivery Alex Soto Continuous Integration / Delivery viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Continuous Integration/Delivery Alex Soto Continuous Integration / Delivery Commit Stage viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Continuous Integration/Delivery Alex Soto Continuous Integration / Delivery Commit Stage Mock Expensive Operations viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Continuous Integration/Delivery Alex Soto Continuous Integration / Delivery Commit Stage Mock Expensive Operations Monitor Tests viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Continuous Integration/Delivery Alex Soto Continuous Integration / Delivery Commit Stage Mock Expensive Operations Monitor Tests Bye Bye Uncertainty viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Recap Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Recap Alex Soto Mock is an option, not a rule viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Recap Alex Soto Mock is an option, not a rule Tests are first citizens viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Recap Alex Soto www.lordofthejars - @alexsotob Mock is an option, not a rule Tests are first citizens Don’t let mocks ruin your quality viernes 18 de octubre de 13
    • Recap Alex Soto www.lordofthejars - @alexsotob Mock is an option, not a rule Tests are first citizens Don’t let mocks ruin your quality Remember TDD viernes 18 de octubre de 13
    • Recap Alex Soto www.lordofthejars - @alexsotob Mock is an option, not a rule Tests are first citizens Don’t let mocks ruin your quality Remember TDD Long Live and Prosper to Tests viernes 18 de octubre de 13
    • Engage Alex Soto viernes 18 de octubre de 13 www.lordofthejars - @alexsotob
    • Contents Alex Soto www.lordofthejars - @alexsotob https://github.com/lordofthejars/foobank/ viernes 18 de octubre de 13
    • Questions? Alex Soto www.lordofthejars - @alexsotob Alex Soto www.lordofthejars.com @alexsotob Let the end of the world come tumbling down, I'll be the last man standing on the ground - Alive - MeatLoaf viernes 18 de octubre de 13