{"id":29944,"date":"2024-10-08T16:00:13","date_gmt":"2024-10-08T14:00:13","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=29944"},"modified":"2024-10-08T16:00:15","modified_gmt":"2024-10-08T14:00:15","slug":"testing-en-rust","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/","title":{"rendered":"Testing en Rust"},"content":{"rendered":"\n<p>En <strong>Rust<\/strong>, hacer pruebas est\u00e1 integrado directamente en el lenguaje, lo que facilita verificar el comportamiento del c\u00f3digo sin necesidad de frameworks externos. Esto, si aplicas t\u00e9cnicas como <strong>TDD<\/strong>, te permite mantener el ciclo de desarrollo \u00e1gil y enfocado en la calidad desde el principio.<\/p>\n\n\n\n<p>Para ejecutar un test en Rust, solo necesitas marcar una funci\u00f3n como prueba usando el atributo <code>#[test]<\/code>. Al usar este atributo, Rust sabe que esa funci\u00f3n debe ejecutarse cuando corres el comando <code>cargo test<\/code> , que es la herramienta para gestionar pruebas en Rust.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">foo<\/span><\/span>() {\n    <span class=\"hljs-comment\">\/\/ some code...<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-funciones-de-ejemplo\">Funciones de ejemplo<\/h2>\n\n\n\n<p>Para mostrar las diferentes aserciones disponibles en Rust, vamos a usar dos funciones sencillas: una que suma dos n\u00fameros y otra que verifica si un n\u00famero es par.<br><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">sum<\/span><\/span>(a: <span class=\"hljs-built_in\">i32<\/span>, b: <span class=\"hljs-built_in\">i32<\/span>) -&gt; <span class=\"hljs-built_in\">i32<\/span> {\n    a + b\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">is_even<\/span><\/span>(a: <span class=\"hljs-built_in\">i32<\/span>) -&gt; <span class=\"hljs-built_in\">bool<\/span> {\n    a % <span class=\"hljs-number\">2<\/span> == <span class=\"hljs-number\">0<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Con estas funciones, podr\u00e1s ver c\u00f3mo se usan los distintos macros de aserciones.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-aserciones\">Aserciones<\/h2>\n\n\n\n<p>En Rust, existen varios macros nativos que puedes usar para hacer pruebas. A continuaci\u00f3n, te muestro los m\u00e1s comunes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-assert\">assert!<\/h3>\n\n\n\n<p>El macro <code>assert!<\/code> es el m\u00e1s b\u00e1sico y se usa para verificar que una expresi\u00f3n booleana sea verdadera. Si la expresi\u00f3n es falsa, la prueba fallar\u00e1 con un <em>panic<\/em>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">check_if_a_number_is_even<\/span><\/span>() {\n    <span class=\"hljs-built_in\">assert!<\/span>(is_even(<span class=\"hljs-number\">6<\/span>));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Este macro es ideal cuando solo necesitas verificar que una condici\u00f3n se cumpla, sin comparar valores espec\u00edficos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-assert-eq\">assert_eq!<\/h3>\n\n\n\n<p>El macro <code>assert_eq!<\/code> compara dos valores para verificar que sean iguales. Si no lo son, la prueba fallar\u00e1 mostrando ambos valores, lo que facilita depurar el problema.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">calculate_the_sum_of_two_numbers<\/span><\/span>() {\n    <span class=\"hljs-built_in\">assert_eq!<\/span>(sum(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), <span class=\"hljs-number\">6<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Funciona para cualquier tipo que implemente el trait <code>PartialEq<\/code>. Por ejemplo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;derive(Debug, PartialEq)]<\/span>\n<span class=\"hljs-keyword\">pub<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">Point<\/span><\/span> {\n    <span class=\"hljs-keyword\">pub<\/span> x: <span class=\"hljs-built_in\">i32<\/span>,\n    <span class=\"hljs-keyword\">pub<\/span> y: <span class=\"hljs-built_in\">i32<\/span>,\n}\n\n<span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">two_points_are_equal<\/span><\/span>() {\n    <span class=\"hljs-keyword\">let<\/span> point1 = Point { x: <span class=\"hljs-number\">1<\/span>, y: <span class=\"hljs-number\">2<\/span> };\n    <span class=\"hljs-keyword\">let<\/span> point2 = Point { x: <span class=\"hljs-number\">1<\/span>, y: <span class=\"hljs-number\">2<\/span> };\n    <span class=\"hljs-built_in\">assert_eq!<\/span>(point1, point2);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-assert-ne\">assert_ne!<\/h3>\n\n\n\n<p>Este macro es el inverso de <code>assert_eq!<\/code>: compara dos valores y verifica que <strong>no<\/strong> sean iguales. Si los valores son iguales, la prueba fallar\u00e1.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">calculate_the_sum_of_two_numbers_fail<\/span><\/span>() {\n    <span class=\"hljs-built_in\">assert_ne!<\/span>(sum(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), <span class=\"hljs-number\">5<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-aserciones-de-depuracion\">Aserciones de depuraci\u00f3n<\/h3>\n\n\n\n<p>Rust tambi\u00e9n tiene macros de depuraci\u00f3n como <code>debug_assert!<\/code>, <code>debug_assert_eq!<\/code> y <code>debug_assert_ne!<\/code>. Estos funcionan igual que los macros anteriores, pero solo se ejecutan en modo debug, no en compilaciones de <code>release<\/code>. Esto puede ser \u00fatil para optimizar el rendimiento.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">calculate_the_sum_of_two_numbers_with_debug<\/span><\/span>() {\n    <span class=\"hljs-built_in\">debug_assert_eq!<\/span>(sum(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), <span class=\"hljs-number\">6<\/span>);\n}\n\n<span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">calculate_the_sum_of_two_numbers_fail_with_debug<\/span><\/span>() {\n    <span class=\"hljs-built_in\">debug_assert_ne!<\/span>(sum(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), <span class=\"hljs-number\">5<\/span>);\n}\n\n<span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">check_if_a_number_is_even_with_debug<\/span><\/span>() {\n    <span class=\"hljs-built_in\">debug_assert!<\/span>(is_even(<span class=\"hljs-number\">6<\/span>));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-otros-macros\">Otros macros<\/h3>\n\n\n\n<p>Adem\u00e1s de los macros nativos, puedes usar librer\u00edas externas para ampliar las aserciones. Por ejemplo, la librer\u00eda <a href=\"https:\/\/docs.rs\/matches\/latest\/matches\/\">matches<\/a> permite verificar si una expresi\u00f3n coincide con un patr\u00f3n.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-keyword\">use<\/span> matches::assert_matches;\n\n<span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">check_an_specific_pattern<\/span><\/span>() {\n    <span class=\"hljs-keyword\">let<\/span> resultado: <span class=\"hljs-built_in\">Result<\/span>&lt;<span class=\"hljs-built_in\">i32<\/span>, &amp;<span class=\"hljs-built_in\">str<\/span>&gt; = <span class=\"hljs-literal\">Ok<\/span>(<span class=\"hljs-number\">10<\/span>);\n    assert_matches!(resultado, <span class=\"hljs-literal\">Ok<\/span>(<span class=\"hljs-number\">10<\/span>));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-organizacion-de-tests-en-rust\">Organizaci\u00f3n de tests en Rust<\/h2>\n\n\n\n<p>Hay dos maneras principales de organizar tus pruebas en Rust: dentro del mismo m\u00f3dulo que el c\u00f3digo productivo o en una carpeta separada llamada <code>tests<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pruebas-en-el-mismo-modulo\">Pruebas en el mismo m\u00f3dulo<\/h3>\n\n\n\n<p>Si colocas las pruebas en el mismo m\u00f3dulo, puedes probar funciones privadas y mantener las pruebas cerca del c\u00f3digo que validan. Esto es \u00fatil en proyectos peque\u00f1os o para pruebas r\u00e1pidas.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;cfg(test)]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">sum<\/span><\/span>(a: <span class=\"hljs-built_in\">i32<\/span>, b: <span class=\"hljs-built_in\">i32<\/span>) -&gt; <span class=\"hljs-built_in\">i32<\/span> {\n    a + b\n}\n\n<span class=\"hljs-meta\">#&#91;cfg(test)]<\/span>\n<span class=\"hljs-keyword\">mod<\/span> tests {\n    <span class=\"hljs-keyword\">use<\/span> super::*;\n\n    <span class=\"hljs-meta\">#&#91;test]<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">calculate_the_sum_of_two_numbers<\/span><\/span>() {\n        <span class=\"hljs-built_in\">assert_eq!<\/span>(sum(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), <span class=\"hljs-number\">6<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pruebas-en-archivos-separados\">Pruebas en archivos separados<\/h3>\n\n\n\n<p>Para proyectos m\u00e1s grandes, es mejor organizar las pruebas en una carpeta  <code>tests<\/code>. Esto te permite mantener el c\u00f3digo de producci\u00f3n separado del c\u00f3digo de prueba.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-keyword\">use<\/span> testing_rust::testing_rust::sum;\n\n<span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">calculate_the_sum_of_two_numbers<\/span><\/span>() {\n    <span class=\"hljs-built_in\">assert_eq!<\/span>(sum(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), <span class=\"hljs-number\">6<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Es una buena pr\u00e1ctica nombrar estos archivos con el sufijo <code>_test.rs<\/code>, por ejemplo: <code>foo_test.rs<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-mocks-en-rust\">Mocks en Rust<\/h2>\n\n\n\n<p>Aunque Rust no tiene un sistema de mocks integrado, librer\u00edas como <a href=\"https:\/\/docs.rs\/mockall\/latest\/mockall\/\">mockall<\/a> permiten crear mocks f\u00e1cilmente. Los mocks son \u00fatiles para simular dependencias externas, como bases de datos o servicios remotos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-definicion-de-la-interfaz\">Definici\u00f3n de la interfaz<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-meta\">#&#91;derive(Debug, PartialEq)]<\/span>\n<span class=\"hljs-keyword\">pub<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">User<\/span><\/span> {\n    <span class=\"hljs-keyword\">pub<\/span> user_id: <span class=\"hljs-built_in\">i32<\/span>,\n    <span class=\"hljs-keyword\">pub<\/span> name: <span class=\"hljs-built_in\">String<\/span>,\n    <span class=\"hljs-keyword\">pub<\/span> age: <span class=\"hljs-built_in\">i32<\/span>,\n}\n\n<span class=\"hljs-keyword\">pub<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">trait<\/span> <span class=\"hljs-title\">DatabaseRepository<\/span><\/span> {\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">find_by_id<\/span><\/span>(&amp;<span class=\"hljs-keyword\">self<\/span>, user_id: &amp;<span class=\"hljs-built_in\">i32<\/span>) -&gt; <span class=\"hljs-built_in\">bool<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-uso-de-mockall-para-crear-un-mock\">Uso de mockall para crear un mock<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-keyword\">use<\/span> mockall::mock;\n<span class=\"hljs-keyword\">use<\/span> testing_rust::database::{DatabaseRepository, User};\n\nmock! {\n  <span class=\"hljs-keyword\">pub<\/span> Database {}\n\n  <span class=\"hljs-keyword\">impl<\/span> DatabaseRepository <span class=\"hljs-keyword\">for<\/span> Database {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">find_by_id<\/span><\/span>(&amp;<span class=\"hljs-keyword\">self<\/span>, user: &amp;<span class=\"hljs-built_in\">i32<\/span>) -&gt; <span class=\"hljs-built_in\">bool<\/span>;\n  }\n}\n\n<span class=\"hljs-meta\">#&#91;test]<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">user_exist_in_database<\/span><\/span>() {\n    <span class=\"hljs-keyword\">let<\/span> <span class=\"hljs-keyword\">mut<\/span> mock_db = MockDatabase::new();\n    <span class=\"hljs-keyword\">let<\/span> user = User { user_id: <span class=\"hljs-number\">1<\/span>, name: <span class=\"hljs-string\">\"test data\"<\/span>.to_string(), age: <span class=\"hljs-number\">20<\/span> };\n    mock_db.expect_find_by_id()\n        .with(mockall::predicate::eq(user.user_id.clone()))\n        .times(<span class=\"hljs-number\">1<\/span>)\n        .returning(|_| <span class=\"hljs-literal\">true<\/span>);\n\n    <span class=\"hljs-keyword\">let<\/span> result = is_user_in_database(&amp;mock_db, &amp;user);\n\n    <span class=\"hljs-built_in\">assert!<\/span>(result);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">is_user_in_database<\/span><\/span>(db: &amp;<span class=\"hljs-keyword\">dyn<\/span> DatabaseRepository, user: &amp;User) -&gt; <span class=\"hljs-built_in\">bool<\/span> {\n    db.find_by_id(&amp;user.user_id)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este caso, hemos utilizado el macro <code>mock!<\/code> para generar un mock de nuestra interfaz <code>DatabaseRepository<\/code>, y luego lo hemos utilizado para simular el comportamiento de nuestra base de datos.<\/p>\n\n\n\n<p>Si prefieres mantener los mocks dentro del mismo m\u00f3dulo que tu c\u00f3digo, puedes usar el atributo <code>#[automock]<\/code> para generar los mocks directamente a partir de la interfaz:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-keyword\">use<\/span> mockall::{automock, mock};\n<span class=\"hljs-keyword\">use<\/span> testing_rust::database::User;\n\n<span class=\"hljs-meta\">#&#91;automock]<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">trait<\/span> <span class=\"hljs-title\">DatabaseRepository<\/span><\/span> {\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">find_by_id<\/span><\/span>(&amp;<span class=\"hljs-keyword\">self<\/span>, user_id: &amp;<span class=\"hljs-built_in\">i32<\/span>) -&gt; <span class=\"hljs-built_in\">bool<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>De esta forma, Rust te proporciona un mock autom\u00e1tico sin tener que crear uno manualmente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>Rust proporciona una infraestructura robusta y flexible para pruebas, integrada directamente en el lenguaje. Ya sea que est\u00e9s escribiendo pruebas unitarias sencillas con <code>assert!<\/code> o pruebas m\u00e1s complejas con mocks usando <code>mockall<\/code>, el ecosistema de pruebas en Rust te permite asegurarte de que tu c\u00f3digo es confiable y robusto.<\/p>\n\n\n\n<p>Existen muchas m\u00e1s herramientas externas para realizar otros tipos de tests, como <a href=\"https:\/\/docs.rs\/proptest\/latest\/proptest\/\">proptest<\/a> para property based testing, o <a href=\"https:\/\/docs.rs\/httpmock\/latest\/httpmock\/\">httpmock<\/a> para hacer tests de integraci\u00f3n con apis http. \u00a1Estas y otras herramientas pueden ser exploradas en un post futuro!<\/p>\n\n\n\n<p>Si quer\u00e9is revisar m\u00e1s cosillas sobre Rust, pod\u00e9is hecharle un ojo a estos art\u00edculos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/\">Smart Pointers<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.ascinfo.dev\/blog\/ownership-en-rust\">Ownership<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En Rust, hacer pruebas est\u00e1 integrado directamente en el lenguaje, lo que facilita verificar el comportamiento del c\u00f3digo sin necesidad de frameworks externos. Esto, si aplicas t\u00e9cnicas como TDD, te permite mantener el ciclo de desarrollo \u00e1gil y enfocado en la calidad desde el principio. Para ejecutar un test en Rust, solo necesitas marcar una&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/\">Read more<\/a><\/p>\n","protected":false},"author":262,"featured_media":22993,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10648,10630],"tags":[10747],"collections":[],"class_list":{"0":"post-29944","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-lenguajes-de-programacion","8":"category-testeo","9":"tag-desarrollo-web","10":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Testing en Rust - Codemotion Magazine tdd testing-en-rust<\/title>\n<meta name=\"description\" content=\"Descubre c\u00f3mo realizar pruebas TDD en Rust, incluyendo tests unitarios y el uso de mocks, con ejemplos pr\u00e1cticos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testing en Rust\" \/>\n<meta property=\"og:description\" content=\"Descubre c\u00f3mo realizar pruebas TDD en Rust, incluyendo tests unitarios y el uso de mocks, con ejemplos pr\u00e1cticos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-08T14:00:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-08T14:00:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1344\" \/>\n\t<meta property=\"og:image:height\" content=\"896\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Aitor Santana\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@aitorsci\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Aitor Santana\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/\"},\"author\":{\"name\":\"Aitor Santana\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/03f6e4465d8f834a4f69a362d4a030df\"},\"headline\":\"Testing en Rust\",\"datePublished\":\"2024-10-08T14:00:13+00:00\",\"dateModified\":\"2024-10-08T14:00:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/\"},\"wordCount\":703,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2023\\\/09\\\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg\",\"keywords\":[\"Desarrollo web\"],\"articleSection\":[\"Lenguajes de programaci\u00f3n\",\"Testeo\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/\",\"name\":\"Testing en Rust - Codemotion Magazine tdd testing-en-rust\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2023\\\/09\\\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg\",\"datePublished\":\"2024-10-08T14:00:13+00:00\",\"dateModified\":\"2024-10-08T14:00:15+00:00\",\"description\":\"Descubre c\u00f3mo realizar pruebas TDD en Rust, incluyendo tests unitarios y el uso de mocks, con ejemplos pr\u00e1cticos.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2023\\\/09\\\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2023\\\/09\\\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg\",\"width\":1344,\"height\":896,\"caption\":\"framework, common developer mistakes and errors to avoid.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/testing-en-rust\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Testeo\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/devops-es\\\/testeo\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Testing en Rust\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/03f6e4465d8f834a4f69a362d4a030df\",\"name\":\"Aitor Santana\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/91630630833-100x100.png\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/91630630833-100x100.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/91630630833-100x100.png\",\"caption\":\"Aitor Santana\"},\"description\":\"Software Crafter | Software Developer in LeanMind. I focus on writing clean and maintainable code. To achieve this, I use techniques such as TDD, sustainable code, design patterns, or clean architectures.\",\"sameAs\":[\"https:\\\/\\\/ascinfo.dev\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/aitorscinfo\",\"https:\\\/\\\/x.com\\\/aitorsci\"],\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/sstark97\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testing en Rust - Codemotion Magazine tdd testing-en-rust","description":"Descubre c\u00f3mo realizar pruebas TDD en Rust, incluyendo tests unitarios y el uso de mocks, con ejemplos pr\u00e1cticos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/","og_locale":"en_US","og_type":"article","og_title":"Testing en Rust","og_description":"Descubre c\u00f3mo realizar pruebas TDD en Rust, incluyendo tests unitarios y el uso de mocks, con ejemplos pr\u00e1cticos.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-10-08T14:00:13+00:00","article_modified_time":"2024-10-08T14:00:15+00:00","og_image":[{"width":1344,"height":896,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg","type":"image\/jpeg"}],"author":"Aitor Santana","twitter_card":"summary_large_image","twitter_creator":"@aitorsci","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Aitor Santana","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/"},"author":{"name":"Aitor Santana","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/03f6e4465d8f834a4f69a362d4a030df"},"headline":"Testing en Rust","datePublished":"2024-10-08T14:00:13+00:00","dateModified":"2024-10-08T14:00:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/"},"wordCount":703,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg","keywords":["Desarrollo web"],"articleSection":["Lenguajes de programaci\u00f3n","Testeo"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/","name":"Testing en Rust - Codemotion Magazine tdd testing-en-rust","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg","datePublished":"2024-10-08T14:00:13+00:00","dateModified":"2024-10-08T14:00:15+00:00","description":"Descubre c\u00f3mo realizar pruebas TDD en Rust, incluyendo tests unitarios y el uso de mocks, con ejemplos pr\u00e1cticos.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg","width":1344,"height":896,"caption":"framework, common developer mistakes and errors to avoid."},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/testing-en-rust\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/"},{"@type":"ListItem","position":3,"name":"Testeo","item":"https:\/\/www.codemotion.com\/magazine\/es\/devops-es\/testeo\/"},{"@type":"ListItem","position":4,"name":"Testing en Rust"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/03f6e4465d8f834a4f69a362d4a030df","name":"Aitor Santana","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/10\/91630630833-100x100.png","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/10\/91630630833-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/10\/91630630833-100x100.png","caption":"Aitor Santana"},"description":"Software Crafter | Software Developer in LeanMind. I focus on writing clean and maintainable code. To achieve this, I use techniques such as TDD, sustainable code, design patterns, or clean architectures.","sameAs":["https:\/\/ascinfo.dev","https:\/\/www.linkedin.com\/in\/aitorscinfo","https:\/\/x.com\/aitorsci"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/sstark97\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-600x400.jpeg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-600x600.jpeg","author_info":{"display_name":"Aitor Santana","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/sstark97\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg",1344,896,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-150x150.jpeg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-300x200.jpeg",300,200,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-768x512.jpeg",768,512,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-1024x683.jpeg",1024,683,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg",1344,896,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg",1344,896,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2.jpeg",100,67,false],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-180x128.jpeg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-896x504.jpeg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-400x225.jpeg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-600x400.jpeg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/WhatsApp-Image-2023-08-02-at-14.18.24-2-600x600.jpeg",600,600,true]},"uagb_author_info":{"display_name":"Aitor Santana","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/sstark97\/"},"uagb_comment_info":0,"uagb_excerpt":"En Rust, hacer pruebas est\u00e1 integrado directamente en el lenguaje, lo que facilita verificar el comportamiento del c\u00f3digo sin necesidad de frameworks externos. Esto, si aplicas t\u00e9cnicas como TDD, te permite mantener el ciclo de desarrollo \u00e1gil y enfocado en la calidad desde el principio. Para ejecutar un test en Rust, solo necesitas marcar una&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/262"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=29944"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29944\/revisions"}],"predecessor-version":[{"id":29977,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29944\/revisions\/29977"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/22993"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=29944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=29944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=29944"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=29944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}