Compartir a través de


Interoperabilidad de .NET

Introducción A IronRuby Y RSpec, parte 1

Ben Hall

Este artículo se basa en una versión preliminar de IronRuby. Toda la información está sujeta a cambios.

En este artículo se describen:

  • Ruby y escribir pato
  • Ruby y Microsoft .NET Framework
  • Utilizar IronRuby y RSpec
En este artículo se utilizan las siguientes tecnologías:
IronRuby

Descarga de código de la Galería de código de MSDN
Examinar el código en línea

Contenido

Definir los requisitos y ejemplos de código
Ruby y escribir pato
Ruby y MetaProgramming
Ruby y .NET Framework
Ruby y CLR
IronRuby interior
Probar una aplicación de C# con IronRuby
Mover hacia adelante

"que es no lo que hemos pedido!" Estoy seguro de que la mayoría de los desarrolladores han oído esta cry desde un cliente poco después de entregar la última generación. El cliente se podría gritos en el programador deficiente por diversas razones, quizás no se entiende correctamente los requisitos o parte del sistema simplemente no funcione.

Dado que los clientes a menudo son claros como para sus propios requisitos, se optar por la seguridad del documento técnico de 100 páginas que intenta definir todo que el sistema tendría que hacer. Mientras tanto, las luchas desarrollador con código heredado no documentada, intentar comprender cómo la aplicación pretende trabajar al intentar implementar nuevos requisitos sin romper nada.

Horas están cambiando. Nuevos métodos para el desarrollo de software están dirigidos a resolver estos problemas, ayudándole a cumplir los requisitos de cliente en el primer intento sin causar errores en el proceso. Estos enfoques aprovechar lenguajes como Ruby, lo que permite crear código puede leer y mantener fácilmente con mucho más cortas iteraciones de desarrollo.

En este artículo, se presente Ruby y IronRuby y demuestre algunos conceptos básicos de transcripción interoperación con código basadas en .NET Framework de Microsoft. También explique cómo marcos de trabajo como RSpec pueden utilizarse para generar ejemplos de cómo objetos pretenden se comportan, proporcionar documentación y comprobación de que el sistema está integrado correctamente. Esta acción establecerá la fase de un artículo futuro en el se Explique en detalle de pruebas de aceptación y muestre crear pruebas de aceptación con IronRuby.

Definir los requisitos y ejemplos de código

Para ayudar a escribir ejemplos y definir los requisitos es necesario un marco de trabajo. Hay muchos enfoques diferentes para escribir pruebas de aceptación automática o las especificaciones de archivo ejecutables. Algunas personas utilizan los marcos de pruebas xUnit estándar correctamente, mientras que otros usuarios utilizan marcos ajustar y idoneidad. Ha encontrado que el mejor método es utilizar Behavior-Driven desarrollo (BDD). Su Norte diseñó un Marco BDD denominado JBehave como una forma de definir escenarios que describen el comportamiento de la aplicación de forma que se puede comunicar al equipo completo, independientemente de la capacidad técnica.

JBehave fue el resultado de los problemas Norte que se enfrenta con Test-Driven desarrollo (TDD) y se ha implementado para el lenguaje de java. Más adelante, Norte crea RBehave, que ya que se ha integrado en RSpec, un marco popular para Ruby. RSpec admite dos enfoques diferentes para BDD: enfoque de su Norte, basado en todos los artículos y escenarios que describa el comportamiento de la aplicación, y Método Astels Dave , que se centra más en la creación de ejemplos en un nivel de objeto.

C# tiene algunos marcos BDD, tales como NSpec y NBehave. El problema principal con la escritura pruebas en C# es que la intención es true de la prueba con frecuencia se oculta debido al hecho de que tiene elementos estructurales adicionales y metadatos, como llaves, públicas y privadas. En general, no creo que lo que se encuentra en oferta via C# y NSpec/NBehave puede coincidir con lo que está disponible a través de IronRuby y RSpec. Anteriormente, esto habría sido un problema importante para los programadores de C#, como se podría no han utiliza el RSpec en función de rubí para probar las aplicaciones de C#. Con IronRuby, esto ya no es un problema.

Aunque todavía pronto en desarrollo, IronRuby es aprovechar de la en tiempo de ejecución de lenguaje dinámico (DLR) para crear una implementación del idioma en la parte superior de CLR Ruby. Con IronRuby, puede emplear existentes aplicaciones Ruby y marcos de trabajo junto con los lenguajes .NET Framework y .NET compatibles con. El resultado es que puede utilizar el lenguaje Ruby y RSpec para probar aplicaciones de C#!

Como un idioma, Ruby es concisa, lo que permite escribir menos código y expresarla de una manera mucho más natural, lo que facilita mantener el código. Por ejemplo, para leer todas las líneas de texto desde un archivo y escribir salida en la consola, podría escribir esto:

File.readlines('AboutMicrosoft.txt').map {|line| puts line}

El código abre el archivo AboutMicrosoft.txt y lee todas las líneas, pasando de cada línea en el bloque, con la línea como un parámetro que, a continuación, se escribe en la consola. En Ruby, un bloque es la colección de instrucciones entre las llaves y es similar al invocar un método en C#, que utiliza la instrucción yield para devolver el control al método de llamada.

Su enfoque de lenguaje natural es uno de los motivos por qué es excelente va a utilizar al probar Ruby. La pruebas y escenarios en este caso, son mucho más legible.

Ruby y escribir pato

Uno de los motivos por qué idiomas Ruby y dinámicos son más fáciles leer es debido a cómo tratar escribir. En lugar de programador definir un tipo, cuando se interrumpe el código Ruby, se deduce el tipo de la variable. El idioma está escrito todavía establecimiento inflexible de tipos, pero determina el tipo de la variable dinámicamente.

Con C#, las interfaces permiten separe de objetos mientras sigue define un contrato para la implementación. Con Ruby, no es necesario para contratos e interfaces. En su lugar, si el objeto tiene una implementación del método se llama a, a continuación, se denomina. Si no es así, a continuación, se devuelve un error. Como se define el contrato para el objeto mediante su implementación, no su relación a otras partes del código.

Para demostrar esto, he creado un método que acepta un valor, el tipo de los cuales se se infiere en tiempo de ejecución. A continuación, se resultados saludo más el valor:

   def SayHello(val)
     puts "Hello #{val}"
   end

Debido de la forma se administran tipos, puede volver a utilizar el mismo método para las cadenas y números enteros sin cambiar ningún código de:

   SayHello("Test") => "Hello Test"
   SayHello(5) => "Hello 5"

Puede tener también ha llamado al método sin corchetes, ya éstos son opcionales en Ruby y pueden hacen mucho más legible la sintaxis:

   SayHello "Test" => "Hello Test"

Esto puede lograrse en C# mediante objeto, pero veamos cómo esto funciona con objetos más complejos. Define un nuevo método para generar el resultado de una llamada a GetName. Siempre que el valor del n parámetro implementa un método denominado GetName, el código no funcionará:

def outputName(n)
  puts n.GetName()
end 

A continuación se dos clases no relacionadas:

class Person
  attr_accessor :name
  def GetName()
    @name
  end
end
class Product
  def GetName()
    "The product with no name"
  end
end

Persona tiene un descriptor de acceso que permite la variable de nombre para establecer, mientras que producto devuelve un valor codificado. En Ruby, no es necesario para escribir la instrucción return, que se devuelve el último resultado de la última línea de código de un método de forma predeterminada.

Si llama a la outputName de método, se llama al método GetName, demuestra cómo escribir rubí puede mejorar reutilización de código ya que no nos son fijos en un único tipo:

outputName(Product.new) => "The product with no name"
$x = Person.new
$x.name = "Ben Hall"
outputName($x) => "Ben Hall"

Si se llama al método con un argumento que no implementa GetName, a continuación, se produce un NoMethodError:

outputName("MyName") => :1:in 'outputName': \
  undefined method 'GetName' \
  for MyName:String (NoMethodError)

Aunque este concepto afecta a algunas personas, puede ser útil; permite para testability mejorada y diseño de la aplicación, especialmente al probar las aplicaciones de C#, que explicará en la sección siguiente.

Ruby y MetaProgramming

Adopta de forma similar a otros lenguajes dinámicos, Ruby el concepto que subyace en metaprogramación. Esto permite extender cualquier clase o el objeto en tiempo de ejecución, lo que le permite definir métodos y comportamiento en tiempo de ejecución, que ofrece la capacidad para desarrollar una aplicación de automodificación. Esto es extremadamente útil en lenguajes dinámicos, especialmente en las pruebas, de unidades ya que permite personalizar el comportamiento de objetos y métodos para sus propios requisitos.

De forma similar, se pueden extender las integradas clases de transcripción para proporcionar su propia funcionalmente, modo muy similar a los métodos de extensión en C# 3.0. Con C#, hay varias restricciones sobre los métodos que se puede crear. Por ejemplo, tenga que ser estático y en una clase independiente. Todo esto harms legibilidad. Con Ruby, es simplemente crear un método normal en una clase existente. Por ejemplo, el valor de tipo Integer es una clase para controlar los números enteros. Entero tiene una serie de métodos, pero no tiene un método para decir que si el número es par.

Para crear dicho método, simplemente cree una nueva clase con el mismo nombre (entero) y definir el método nuevo. La marca pregunta al final del método indica que se devuelve un valor de tipo Boolean con el objetivo de facilitar la lectura:

class Integer
   def even?()
       self.abs % 2 == 0
   end
end
puts 2.even? => true
puts 1.even? => false

Ruby y .NET Framework

En lugar de la antigua debate acerca de si se debe utilizar un lenguaje estático o dinámico, IronRuby permite usar el idioma correcto para el trabajo. Si más sentido usar C#, a continuación, puede utilizar C#. Si tiene un enfoque más dinámico, puede utilizar fácilmente IronRuby, teniendo ventaja de la interoperabilidad con .NET y la naturaleza dinámica del idioma Ruby. Debe prever las personas que utilizan una combinación de diferentes idiomas y tecnologías, tal como C# para la aplicación principal y Ruby para las pruebas.

El DLR proporciona el fundamento para habilitar la interoperabilidad de .NET. Con esto en su lugar, se puede aprovechar de tecnología de interfaz de usuario, como formularios Windows Forms, Windows Presentation Foundation (WPF) y Silverlight al escribir código de la aplicación en Ruby.

Si aprovecha WPF desde IronRuby es fácil. Cuando se ejecuta el código siguiente, puede tener una ventana WPF pleno creada a partir de IronRuby. Aún debe hacer referencia mscorlib y los dos ensamblados WPF incluidos con .NET Framework 3.0, como hizo con C#, utilizando el requieren instrucciones:

require 'mscorlib'
require 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
require 'PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

Ahora puede crear e interactuar con los objetos WPF. En primer lugar, cree alias para todos los objetos que desee utilizar. Esto hace más limpio, el código que no necesite tener acceso al objeto mediante su espacio de nombres:

Window = System::Windows::Window
Application = System::Windows::Application
Button = System::Windows::Controls::Button

A continuación, crear una ventana WPF y darle un título:

win = Window.new
win.title = 'IronRuby and WPF Interop'

Crear un botón de la misma manera:

mainButton = Button.new
mainButton.content = 'I'm a WPF button — press me'

En ambos casos ESTOY utilizando el alias para tener acceso el nombre completo del objeto. Cuando se hace clic en el botón, desea mostrar un MessageBox para el usuario. Como lo haría en C#, puede suscribirse al evento y proporcionar un bloque que se llama cuando se invoca el evento click:

mainButton.click do |sender, args|
  System::Windows::MessageBox.Show("Created using IronRuby!")
end

Por último, establece el contenido de la ventana para ser el botón, crea un nuevo objeto Application e iniciar la ventana:

win.content = mainButton
my_app = Application.new
my_app.run win

fig01.gif

Figura 1 utilizar IronRuby para crear una aplicación WPF

En este momento, se mostrará una ventana WPF totalmente interactiva con el evento click correctamente cableado hasta tal como se muestra en la figura 1 . Interactuar con .NET Framework de la misma forma que se podría interactuar con bibliotecas Ruby. Uno de los principales principal establece fuera John lam y equipo era permanecer true en el idioma Ruby. Esto es una importante para la adopción por los desarrolladores de transcripción actuales, que no desean cambiar el modo en que crean aplicaciones Ruby simplemente porque está trasladando a IronRuby. En su lugar pueden obtener acceso todo el código .NET enriquecido de la misma manera.

Ruby y CLR

Aquí es otro ejemplo. Si intenta obtener acceso a AddRange en IEnumerable, en C# el código tendría este aspecto:

ArrayList list = new ArrayList();
list.AddRange(new [] { 1,2,3,4 });

Sin embargo, con Ruby, es la convención aceptada para palabras en nombres de método se separados por caracteres de subrayado para mejorar la legibilidad. Crear una biblioteca independiente para seguir esta convención sería demasiado lento y propensa, y no admitiría desarrollo adicional de otros fabricantes.

En su lugar, para los objetos CLR, IronRuby traduce llamadas de método Ruby en el nombre de método equivalente para el CLR:

   $list = ArrayList.new
   $list.add_range([1,2,3,4])

Aquí me obtener acceso al método AddRange siguiente enfoque de rubí, que es minúsculas con las palabras separadas por un carácter de subrayado. Si lo prefiere, puede mantener con la convención de nomenclatura de CLR como el nombre del método todavía existe desde Ruby:

$list.AddRange([1,2,3,4])

Ambos funcionan la misma; es simplemente una preferencia personal que se va a utilizar.

Como he mencionado, Ruby deduce el tipo de objetos en tiempo de ejecución, y esto es la misma al controlar objetos de C#. Tenga en cuenta una serie de métodos de C# que tipos de objetos diferentes devueltos, mientras se se devuelve el mismo objeto, la firma del método devuelve la interfaz o el tipo concreto. En mi ejemplo, tienen una interfaz que define un método HelloWorld único:

public interface IHello {
  string HelloWorld();    
}

Había creado una clase Hello4Times que herede Hello3Times, que hereda de la interfaz, pero ha implementado tres métodos Hello­World adicionales. Dentro de la clase definir un nuevo método denominado HelloMethodOn4Times que llama a la implementación base:

public class Hello4Times : Hello3Times {
  public string HelloMethodOn4Times () {
    return base.HelloWorld();
  }
}

A continuación, define una clase estática y métodos que se devuelva una nueva instancia de la clase Hello4Times pero vuelve al código de llamada como una interfaz. Esto significa que el código de llamada sólo debe conocer HelloWorld no cualquiera de los métodos adicionales definidos:

public static class HelloWorld {
  public static IHello ReturnHello4TimesAsInterface() {
    return new Hello4Times();
  }

En mi código Ruby, hay dos llamadas de método. La llamada primera está en el método de la interfaz definida, que se esperaría para trabajar sin un problema. Sin embargo, la segunda llamada es el método de la clase concreta. IronRuby determinó el tipo del objeto que se devuelve y se puede enviar las llamadas al método:

puts InteropSample::HelloWorld.ReturnHello4TimesAsInterface.HelloWorld
puts interopSample::HelloWorld.ReturnHello4TimesAsInterface.HelloMethodOn4Times

Todo esto sucede sin que alguna vez necesidad de preocuparse por convirtiendo el objeto al tipo correcto para llamar al método.

Después de este tema, se pueden extender objetos de .NET de exactamente la misma manera como haría con objetos Ruby. Cuando se muestra un MessageBox, no deseo conservar definir qué iconos y botones para utilizarlos. En su lugar, sólo desea proporcionar un mensaje.

Tal vez no como la funcionalidad integrada y desea extiende la clase MessageBox real para la interacción perfecta. Con Ruby, esto es sencilla. Definir una clase nueva que es el mismo que el integrado en MessageBox en WPF. A continuación cree un nuevo método de la clase que simplemente llama al método mostrar con distintos valores predeterminados:

class System::Windows::MessageBox
  def self.ShowMessage(msg)
    System::Windows::MessageBox.Show(msg, msg, \
      System::Windows::MessageBoxButton.OK, \
      System::Windows::MessageBoxImage.Stop)
  end
end

Después de ejecutar este bloque de código

System::Windows::MessageBox.ShowMessage( \
  "I'm going to show you a message") 

se puede llamar al método ShowMessage, el resultado que se va al cuadro de mensaje que se muestra en La figura 2 .

fig02.gif

La Figura 2 Mostrar un MessageBox personalizado de rubí

IronRuby interior

¿Cómo se interoperabilidad posible? La respuesta es la DLR. En un nivel alto, al ejecutar código Ruby mediante IronRuby, mucho trabajo tiene lugar en segundo plano. En primer lugar, el código que escribe se tokenized y analiza por el motor de IronRuby. El código analizado, a continuación, se convierte en el DLR resumen sintaxis árbol (AST). Esto es un estándar AST que todas las implementaciones de idioma, como IronPython, es necesario proporcionar el DLR para ejecutar el código.

Una vez que el DLR tiene el AST, convierte el árbol en lenguaje intermedio (IL). Todo el código de .NET se compila hacia abajo en el IL para proporcionar un idioma genérico para el CLR. Se trata cómo IronRuby puede interoperar con .NET Framework, en segundo plano, todo el código se ejecuta como instrucciones de lenguaje INTERMEDIO. Una vez la DLR finalizado la conversión, pasa el IL a CLR para su ejecución y el resultado se devuelve al IronRuby.

Durante este proceso hay pasos adicionales para mejorar el rendimiento y confiabilidad, como el almacenamiento en caché. Para obtener una explicación más profunda, se recomienda leer la columna de lista Chiles CLR Inside Out" Iron­Python y el dinámico Language Runtime"en octubre de 2007 emitir de MSDN Magazine .

Dentro de un ensamblado independiente hay una API host que permite incrustar IronRuby dentro de sus aplicaciones, lo que permite ejecutar el código transcripción de C# o los usuarios para ejecutar su propio código.

Para obtener más información acerca de la implementación de IronRuby, descargar el código origen completo de RubyForge. IronRuby es un proyecto de código abierto implementado en C# y es un excelente ejemplo de una implementación de lenguaje dinámico. IronPython es disponible ya aloja un proyecto de código fuente abierto en CodePlex, e incluye un idioma de ejemplo llamado ToyScript si desea una introducción a cómo funciona la DLR.

Para garantizar la continuada compatibilidad con el núcleo plataforma Ruby, el equipo IronRuby utiliza RubySpecs. Esto es un conjunto compartido de ejemplos basado en cómo se debe implementar el idioma Ruby. El objetivo de RubySpecs es para asegurarse de diferentes implementaciones incluidos del Matz Ruby Interpreter (MRI), JRuby, MacRuby y IronRuby tienen el mismo comportamiento. RubySpecs utiliza una versión compatible de la sintaxis del RSpec denominado MSpec. Estos se muestran como las pruebas de aceptación de la implementación de IronRuby.

Probar una aplicación de C# con IronRuby

Durante muchos años ahora, ha aumentado el conocimiento y la práctica de TDD como forma de desarrollar software, como resultado código de calidad superior, en términos de diseño y mantenimiento, junto con menos defectos en el camino. Con IronRuby, puede utilizar el marco de especificación de RSpec y runner para proporcionar ejemplos de cómo mi C# objetos trabajo, sigue un enfoque BDD en lugar de TDD.

Mientras que el marco de escenario, que abordaré en un próximo artículo, más se alinea con las pruebas en el nivel de aplicación de aceptación, el marco de la especificación más se alinea a los desarrolladores escribir sus propios especificaciones sobre el código que va justo a implementar y su comportamiento esperado. El marco de la especificación se basa por proporcionar ejemplos que describen el comportamiento en el nivel de objeto. Estos ejemplos se pueden ejecutar para comprobar que la implementación del sistema sigue funcionando como el desarrollador espera al mismo tiempo que proporciona documentación acerca de cómo se espera que los objetos se comportan.

Esto es una distinción importante comparada con los marcos de las pruebas de unidades como NUnit y MbUnit. Ambos de los atributos de prueba de uso para indicar un método es una prueba para el sistema. RSpec tiene un enfoque diferente. RSpec indica que cada método es un ejemplo de cómo el código se pretende trabajo. Aunque la distinción es sutil, cambia la forma en que escribe los ejemplos, incluida la terminología que utiliza, la forma en que organice los métodos, y cómo el concepto puede se entiende fácilmente comparados en TDD. Con BDD y RSpec, junto con la estrecha integración de IronRuby y .NET Framework, se puede iniciar utilizando IronRuby para probar las aplicaciones de C#. En términos de un ejemplo, el ejemplo de RSpec clásico es el juego Bowling.

Primero, tiene que obtener acceso a implementación el juego bowling en un ensamblado de C#:

require File.dirname(__FILE__) + \
  '/InteropSamples/Bowling/Bowling/bin/Debug/bowling.dll'

A continuación, deberá tener acceso a RSpec:

require 'rubygems'
require 'spec'

Ahora puede empezar a escribir ejemplos. Éste es un ejemplo que muestra cómo debería funcionar bowling implementación. RSpec tiene un idioma específico de dominio (DSL) que debe seguir para que los ejemplos que ejecutable. La primera parte de la DSL es el bloque describe. Aquí simplemente indicar el objeto que están "describe" junto con una descripción opcional. En este caso, definir el objeto Bowling, que se implementarán en C#:

describe Bowling, " defines the bowling game" do

Para mejorar la legibilidad, se realizará ninguna configuración en un antes de bloque:

  before(:each) do  
    @bowling = Bowling.new 
  End

Estoy ahora en una posición para interactuar con el objeto, crear en el ejemplo se y comprobar que funciona correctamente. SE usa "se" bloque, que proporciona una cadena que indica el contexto de en el ejemplo se y lo que está mostrando. , A continuación, escribir la sección de código que interactúa con el sistema y comprueba que se ha producido la acción correcta:

  it "should score 0 for a gutter game" do
    20.times { @bowling.hit(0) }
    @bowling.score.should == 0
  end
end

La implementación de C# sólo tiene este aspecto:

public class Bowling {
  public int Score { get; set; }
  public void Hit(int pins)
    { Score += pins; }
}

Finalmente, ejecute esta opción para que compruebe que el ejemplo bowling funciona como se espera con RSpec prueba de objetos de C#:

>ir bowling_spec.rb
.
Finished in 1.0458315 seconds
1 example, 0 failures

Si quería un informe más detallado, podría seleccione el formato que specdoc. Esto genera la descripción del objeto junto con todos los ejemplos, que indica si han superado o no:

>ir bowling_spec.rb --format specdoc
Bowling defines the bowling game
- should score 0 for a gutter game
Finished in 1.43728 seconds
1 example, 0 failures

En el momento de escribir, el equipo IronRuby es no regularmente envío binarios. Se dice que el equipo está esperando hasta que esté satisfecho con la implementación, compatibilidad y rendimiento antes de liberar los binarios oficiales. Sin embargo, dado que el código fuente está disponible gratuitamente, puede descargar el código y crear usted mismo.

Para descargar el código fuente, deberá tener un cliente de control de origen de GIT, tales como msysgit, instalado. El Control de código fuente IronRubyestá disponible en línea. Si desea obtener más información, entonces se recomienda que visite la Sitio del proyecto IronRuby o mi blog" Descargar IronRuby desde GitHub." Una vez que haya descargado el código fuente, se puede compilar el ensamblado con Visual Studio mediante el archivo de solución IronRuby.sln o, si tienes MRI instalado, a continuación, puede utilizar el comando:

rake compile

Cuando haya IronRuby compilado, debe descargar bibliotecas de varias, como RSpec, para obtener la funcionalidad adicional. Ruby tiene un concepto de RubyGems donde las gemas son paquetes se pueden descargar para obtener la funcionalidad y las dependencias adicionales. Para descargar RSpec, escriba lo siguiente en el símbolo del sistema:

gem install rspec

Podría ahora podrá tener acceso a la biblioteca RSpec desde dentro del código Ruby. Sin embargo, en el momento de escribir, RSpec no funciona con IronRuby debido a uno o dos errores. Espero que en el momento en que se publica en este artículo RSpec debe estar trabajando con IronRuby. Para averiguar el estado de la compatibilidad de RSpec, consulte el Sitio Web de RSpec o el Lista de distribución de correo IronRuby.

Si no se corrige el error, ha realizado un binario con el error corregido, together with la biblioteca RSpec en su lugar. (Nota: no utilice esta versión de una vez que el equipo solucionado el problema.)

Una vez que haya los binarios correctos, ir.exe es el intérprete IronRuby que puede ejecutar el código. Si simplemente iniciar la aplicación desde la línea de comandos, especificará la consola interactiva. En Ruby, código se ejecuta en una línea por línea de base, excelente para aprender y depuración, sino también para ejecutar comandos corta para resolver los problemas diarios. Si proporciona un nombre de archivo como un parámetro, se ejecuta con el resultado de los resultados en la consola.

Mover hacia adelante

En mi próximo artículo, se presente el concepto de las pruebas de aceptación y cómo puede mejorar la comunicación entre clientes y desarrolladores. Mostraré cómo pueden ser las pruebas de aceptación automática utilizando IronRuby y RSpec para comprobar las aplicaciones .NET y crear una especificación ejecutable para el sistema.

Bernardo Díaz es un desarrollador de C# o ingeniero de pruebas con una pasión seguro para el desarrollo de software y encanta escribir código. Juan trabaja en la red Gate software en el Reino Unido como un ingeniero de pruebas y disfruta explorar diferentes formas de software de prueba, incluidos manual y automatizada pruebas, centrándose en las mejores formas para probar distintos tipos de aplicaciones. Juan es un EXPERTO en C# y mantiene un blog en Blog.BenHall.me.uk.