2010-05-15 4 views
1

je lance cassiniDev de cmdarrêt cassiniDev après le test d'arrêt

C: \ CruiseControl.NET-1.5.0.6237 \ cassinidev.3.5.0.5.src-repack \ CassiniDev \ bin \ Debug \ CassiniDev.exe/a: D: _CCNET \ proj/pm: Spécifique/p: 3811

puis lancez le débogage et le test. Comment puis-je arrêter cassiniDev de CMD après avoir fini les tests. J'essaye avec cassiniDev_console mais console ne fonctionnant pas ainsi j'utilise cassiniDev de la console.

+1

Je viens de publier la bêta CassiniDev 3.5.1/4.0.1 avec un exemple d'appareil d'essai simple si vous êtes intéressé. –

Répondre

3

D'abord, heureux de voir quelqu'un se fait usage de CassiniDev et de répondre à votre question:

Vous pouvez commencer avec le délai d'attente param:/t: [ms till kill]

C:\CruiseControl.NET-1.5.0.6237\cassinidev.3.5.0.5.src-repack\CassiniDev\bin\Debug\CassiniDev.exe /a:D:_CCNET\proj /pm:Specific /p:3811 /t:20000 

Ceci indiquera à l'application de s'éteindre après 20 secondes sans demande.

En ce qui concerne l'échec de l'application console: Le repack devrait avoir résolu les problèmes avec la construction de la console. Pouvez-vous ajouter un problème et décrire le problème? Deuxièmement, vous pouvez remarquer dans le projet de console un type appelé Fixture qui, si vous suivez l'exemple des tests NUnit, peut être utilisé pour héberger le serveur dans un appareil de test et le fermer lorsque le test est terminé. Troisièmement, CassiniDev a été créé pour permettre un serveur ASP.Net facile à utiliser sur un IP autre que le bouclage.

Votre ligne de commande indique que vous n'avez pas besoin de cela afin que vous puissiez avoir une meilleure expérience en utilisant une méthode plus native, comme simplement héberger WebDevHost.

Je prévois d'annoncer cette possibilité alternative sur la page CassiniDev bientôt. On dirait que je devrais me dépêcher. ;-)

Essayez ceci:

montage d'essai de l'échantillon

using System.Net; 
using NUnit.Framework; 

namespace Salient.Excerpts 
{ 
    [TestFixture] 
    public class WebHostServerFixture : WebHostServer 
    { 
     [TestFixtureSetUp] 
     public void TestFixtureSetUp() 
     { 
      StartServer(@"..\..\..\..\TestSite"); 

      // is the equivalent of 
      // StartServer(@"..\..\..\..\TestSite", 
      // GetAvailablePort(8000, 10000, IPAddress.Loopback, true), "/", "localhost"); 
     } 
     [TestFixtureTearDown] 
     public void TestFixtureTearDown() 
     { 
      StopServer(); 
     } 

     [Test] 
     public void Test() 
     { 
      // while a reference to the web app under test is not necessary, 
      // if you do add a reference to this test project you may F5 debug your tests. 
      // if you debug this test you will break in Default.aspx.cs 
      string html = new WebClient().DownloadString(NormalizeUri("Default.aspx")); 
     } 
    } 
} 

WebHostServer.cs

// Project: Salient 
// http://salient.codeplex.com 
// Date: April 16 2010 

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Net.NetworkInformation; 
using System.Threading; 
using Microsoft.VisualStudio.WebHost; 

namespace Salient.Excerpts 
{ 
    /// <summary> 
    /// A general purpose Microsoft.VisualStudio.WebHost.Server test fixture. 
    /// WebHost.Server is the core of the Visual Studio Development Server (WebDev.WebServer). 
    /// 
    /// This server is run in-process and may be used in F5 debugging. 
    /// </summary> 
    /// <remarks> 
    /// If you are adding this source code to a new project, You will need to 
    /// manually add a reference to WebDev.WebHost.dll to your project. It cannot 
    /// be added from within Visual Studio. 
    /// 
    /// Please see the Readme.txt accompanying this code for details. 
    /// </remarks> 
    /// NOTE: code from various namespaces/classes in the Salient project have been merged into this 
    /// single class for this post in the interest of brevity 
    public class WebHostServer 
    { 
     private Server _server; 

     public string ApplicationPath { get; private set; } 

     public string HostName { get; private set; } 

     public int Port { get; private set; } 

     public string VirtualPath { get; private set; } 

     public string RootUrl 
     { 
      get { return string.Format(CultureInfo.InvariantCulture, "http://{0}:{1}{2}", HostName, Port, VirtualPath); } 
     } 

     /// <summary> 
     /// Combine the RootUrl of the running web application with the relative url specified. 
     /// </summary> 
     public virtual Uri NormalizeUri(string relativeUrl) 
     { 
      return new Uri(RootUrl + relativeUrl); 
     } 

     /// <summary> 
     /// Will start "localhost" on first available port in the range 8000-10000 with vpath "/" 
     /// </summary> 
     /// <param name="applicationPath"></param> 
     public void StartServer(string applicationPath) 
     { 
      StartServer(applicationPath, GetAvailablePort(8000, 10000, IPAddress.Loopback, true), "/", "localhost"); 
     } 

     /// <summary> 
     /// </summary> 
     /// <param name="applicationPath">Physical path to application.</param> 
     /// <param name="port">Port to listen on.</param> 
     /// <param name="virtualPath">Optional. defaults to "/"</param> 
     /// <param name="hostName">Optional. Is used to construct RootUrl. Defaults to "localhost"</param> 
     public void StartServer(string applicationPath, int port, string virtualPath, string hostName) 
     { 
      if (_server != null) 
      { 
       throw new InvalidOperationException("Server already started"); 
      } 

      // WebHost.Server will not run on any other IP 
      IPAddress ipAddress = IPAddress.Loopback; 

      if(!IsPortAvailable(ipAddress, port)) 
      { 
       throw new Exception(string.Format("Port {0} is in use.", port)); 
      } 

      applicationPath = Path.GetFullPath(applicationPath); 

      virtualPath = String.Format("/{0}/", (virtualPath ?? string.Empty).Trim('/')).Replace("//", "/"); 

      _server = new Server(port, virtualPath, applicationPath, false, false); 
      _server.Start(); 

      ApplicationPath = applicationPath; 
      Port = port; 
      VirtualPath = virtualPath; 
      HostName = string.IsNullOrEmpty(hostName) ? "localhost" : hostName; 
     } 

     /// <summary> 
     /// Stops the server. 
     /// </summary> 
     public void StopServer() 
     { 
      if (_server != null) 
      { 
       _server.Stop(); 
       _server = null; 
       // allow some time to release the port 
       Thread.Sleep(100); 
      } 
     } 

     public void Dispose() 
     { 
      StopServer(); 
     } 


     /// <summary> 
     /// Gently polls specified IP:Port to determine if it is available. 
     /// </summary> 
     /// <param name="ipAddress"></param> 
     /// <param name="port"></param> 
     public static bool IsPortAvailable(IPAddress ipAddress, int port) 
     { 
      bool portAvailable = false; 

      for (int i = 0; i < 5; i++) 
      { 
       portAvailable = GetAvailablePort(port, port, ipAddress, true) == port; 
       if (portAvailable) 
       { 
        break; 
       } 
       // be a little patient and wait for the port if necessary, 
       // the previous occupant may have just vacated 
       Thread.Sleep(100); 
      } 
      return portAvailable; 
     } 

     /// <summary> 
     /// Returns first available port on the specified IP address. 
     /// The port scan excludes ports that are open on ANY loopback adapter. 
     /// 
     /// If the address upon which a port is requested is an 'ANY' address all 
     /// ports that are open on ANY IP are excluded. 
     /// </summary> 
     /// <param name="rangeStart"></param> 
     /// <param name="rangeEnd"></param> 
     /// <param name="ip">The IP address upon which to search for available port.</param> 
     /// <param name="includeIdlePorts">If true includes ports in TIME_WAIT state in results. 
     /// TIME_WAIT state is typically cool down period for recently released ports.</param> 
     /// <returns></returns> 
     public static int GetAvailablePort(int rangeStart, int rangeEnd, IPAddress ip, bool includeIdlePorts) 
     { 
      IPGlobalProperties ipProps = IPGlobalProperties.GetIPGlobalProperties(); 

      // if the ip we want a port on is an 'any' or loopback port we need to exclude all ports that are active on any IP 
      Func<IPAddress, bool> isIpAnyOrLoopBack = i => IPAddress.Any.Equals(i) || 
                  IPAddress.IPv6Any.Equals(i) || 
                  IPAddress.Loopback.Equals(i) || 
                  IPAddress.IPv6Loopback. 
                   Equals(i); 
      // get all active ports on specified IP. 
      List<ushort> excludedPorts = new List<ushort>(); 

      // if a port is open on an 'any' or 'loopback' interface then include it in the excludedPorts 
      excludedPorts.AddRange(from n in ipProps.GetActiveTcpConnections() 
            where 
             n.LocalEndPoint.Port >= rangeStart && 
             n.LocalEndPoint.Port <= rangeEnd && (
             isIpAnyOrLoopBack(ip) || n.LocalEndPoint.Address.Equals(ip) || 
             isIpAnyOrLoopBack(n.LocalEndPoint.Address)) && 
             (!includeIdlePorts || n.State != TcpState.TimeWait) 
            select (ushort)n.LocalEndPoint.Port); 

      excludedPorts.AddRange(from n in ipProps.GetActiveTcpListeners() 
            where n.Port >= rangeStart && n.Port <= rangeEnd && (
            isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address)) 
            select (ushort)n.Port); 

      excludedPorts.AddRange(from n in ipProps.GetActiveUdpListeners() 
            where n.Port >= rangeStart && n.Port <= rangeEnd && (
            isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address)) 
            select (ushort)n.Port); 

      excludedPorts.Sort(); 

      for (int port = rangeStart; port <= rangeEnd; port++) 
      { 
       if (!excludedPorts.Contains((ushort)port)) 
       { 
        return port; 
       } 
      } 

      return 0; 
     } 
    } 
} 

REMARQUE:

L'espace de noms Microsoft.VisualStudio.WebHost est contenu dans le fichier WebDev.WebHost.dll. Ce fichier est dans le GAC mais il n'est pas possible d'ajouter une référence à cet assembly à partir de Visual Studio.

Pour ajouter une référence, vous devez ouvrir votre fichier .csproj dans un éditeur de texte et ajouter la référence manuellement.

Recherchez le ItemGroup qui contient les références de projet et ajouter l'élément suivant:

<Reference Include="WebDev.WebHost, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86"> 
    <Private>False</Private> 
</Reference> 

Référence: le second exemple de http://www.codeproject.com/KB/aspnet/test-with-vs-devserver-2.aspx

+0

thx pour une si bonne réponse – senzacionale