ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
Loopt

   Heine Frifeldt <heine@loopt.com>
         Server Team Manager

        Tools used for testing




                                      1
Loopt - Connecting You with the Places You Go




                                                2
Kiln for source control, wiki and bug tracking




                                                 3
DB Schema in Mercurial via
RedGate SQL Source Control




                             4
Unit tests via Visual Studio 2010




                                    5
Continuous builds via Jenkins




                                6
Nightly Functional Tests via custom attribute


      [TestMethod, ExecuteNightly]
      public void FacebookSearch()
      {
           var adapter = new FacebookAdapter();
           var places = adapter.Search(coords, 10000);
           Assert.IsTrue(places.Count() > 0);
      }




                                                         7
Hard to test code that uses statics


public Configuration GetConfiguration()
{
     string[] conf = File.ReadAllLines("Config.xml");

    // parse contents and construct Configuration obj
    ¡­




                                                        8
Constructors as like static methods
          Keep them simple

public class User
{
     public User(int userId)
     {
          DataProvider provider = new DataProvider();
          var data = provider.GetUserInfo(userId);
          ¡­
     }




                                                        9
Hard to test code that has object
initialization inside business logic

 public Deal[] GetGrouponDeals()
 {
      WebClient client = new WebClient();

     // Logic to retrieve and parse the response
     ¡­
 }




                                                   10
Separate object graph from logic
   Ie. remove new operators

public GrouponAdapter(ILooptWebClient webClient)
{
     _webClient = webClient;
}

public Deal[] GetGrouponDeals()
{
     // Use _webClient to retrieve URL
     ¡­




                                                   11
Dependency injection ? Test able code

[TestMethod]
public void VerifyDeals()
{
     var testClient = new TestWebClient();
     var groupon = new GrouponAdapter(testClient);

    // Now you control the URL response
    ¡­
}




                                                     12
Root of application will have logic to
       construct object graphs

public CoreService(
         IDealManager dealManager,
         IUserManager userManager,
         ¡­



public DealManager(
         IGrouponAdapter grouponAdapter,
         IDataProvider dataProvider,
         IPoiController poiController)



                                           13
Use ¡°Ninject¡± to construct object graph



 ¡­
 _kernel.Get<GrouponAdapter>();
 ¡­




                                          14
Use ¡°Ninject¡± to construct object graph



 ¡­
 Bind<ILooptWebClient>().To<LooptWebClient>();
 ¡­




                                                 15
¡°Moq¡± as object mock framework

[TestMethod]
public void VerifyDeals()
{
     var testClient = new Mock<ILooptWebClient>();
     testClient.
          Setup(c => c.GetUrl(It.IsAny<Uri>())).
          Returns(Resources.MyResponse);

    var groupon = new GrouponAdapter(testClient);

    ¡­
}


                                                     16
Manage packages via NuGet




                            17
Queries into log files via Splunk




                                    18
Key benchmarks on TV screen via Gecko Board




                                              19
Tool Resources
   ?   Source Control ¨C Mercurial via Kiln
        ? http://www.fogcreek.com/kiln/
   ?   SQL Tools - Redgate SQL Source Control / SQL Compare
        ? http://www.red-gate.com/products/sql-development/
   ?   Automated Build Environment ¨C Jenkins
        ? http://jenkins-ci.org
   ?   Dependency Injection / Testable code
        ? http://misko.hevery.com/2008/11/11/clean-code-talks-dependency-injection
   ?   Dependency Injection Framework ¨C Ninject
        ? http://ninject.org
   ?   Mock Framework ¨C Moq
        ? http://code.google.com/p/moq
   ?   Library extension for Visual Studio ¨C Nuget
        ? http://nuget.org
   ?   Log file Index and Parser ¨C Splunk
        ? http://www.splunk.com
   ?   Engineering dashboard ¨C Gecko board
        ? http://www.geckoboard.com




                                                                                     20

More Related Content

BizSpark SF Lightning Talk: "Automated Testing (Unit, Integration and Systems)" by Heine Frifeldt

  • 1. Loopt Heine Frifeldt <heine@loopt.com> Server Team Manager Tools used for testing 1
  • 2. Loopt - Connecting You with the Places You Go 2
  • 3. Kiln for source control, wiki and bug tracking 3
  • 4. DB Schema in Mercurial via RedGate SQL Source Control 4
  • 5. Unit tests via Visual Studio 2010 5
  • 7. Nightly Functional Tests via custom attribute [TestMethod, ExecuteNightly] public void FacebookSearch() { var adapter = new FacebookAdapter(); var places = adapter.Search(coords, 10000); Assert.IsTrue(places.Count() > 0); } 7
  • 8. Hard to test code that uses statics public Configuration GetConfiguration() { string[] conf = File.ReadAllLines("Config.xml"); // parse contents and construct Configuration obj ¡­ 8
  • 9. Constructors as like static methods Keep them simple public class User { public User(int userId) { DataProvider provider = new DataProvider(); var data = provider.GetUserInfo(userId); ¡­ } 9
  • 10. Hard to test code that has object initialization inside business logic public Deal[] GetGrouponDeals() { WebClient client = new WebClient(); // Logic to retrieve and parse the response ¡­ } 10
  • 11. Separate object graph from logic Ie. remove new operators public GrouponAdapter(ILooptWebClient webClient) { _webClient = webClient; } public Deal[] GetGrouponDeals() { // Use _webClient to retrieve URL ¡­ 11
  • 12. Dependency injection ? Test able code [TestMethod] public void VerifyDeals() { var testClient = new TestWebClient(); var groupon = new GrouponAdapter(testClient); // Now you control the URL response ¡­ } 12
  • 13. Root of application will have logic to construct object graphs public CoreService( IDealManager dealManager, IUserManager userManager, ¡­ public DealManager( IGrouponAdapter grouponAdapter, IDataProvider dataProvider, IPoiController poiController) 13
  • 14. Use ¡°Ninject¡± to construct object graph ¡­ _kernel.Get<GrouponAdapter>(); ¡­ 14
  • 15. Use ¡°Ninject¡± to construct object graph ¡­ Bind<ILooptWebClient>().To<LooptWebClient>(); ¡­ 15
  • 16. ¡°Moq¡± as object mock framework [TestMethod] public void VerifyDeals() { var testClient = new Mock<ILooptWebClient>(); testClient. Setup(c => c.GetUrl(It.IsAny<Uri>())). Returns(Resources.MyResponse); var groupon = new GrouponAdapter(testClient); ¡­ } 16
  • 18. Queries into log files via Splunk 18
  • 19. Key benchmarks on TV screen via Gecko Board 19
  • 20. Tool Resources ? Source Control ¨C Mercurial via Kiln ? http://www.fogcreek.com/kiln/ ? SQL Tools - Redgate SQL Source Control / SQL Compare ? http://www.red-gate.com/products/sql-development/ ? Automated Build Environment ¨C Jenkins ? http://jenkins-ci.org ? Dependency Injection / Testable code ? http://misko.hevery.com/2008/11/11/clean-code-talks-dependency-injection ? Dependency Injection Framework ¨C Ninject ? http://ninject.org ? Mock Framework ¨C Moq ? http://code.google.com/p/moq ? Library extension for Visual Studio ¨C Nuget ? http://nuget.org ? Log file Index and Parser ¨C Splunk ? http://www.splunk.com ? Engineering dashboard ¨C Gecko board ? http://www.geckoboard.com 20

Editor's Notes

  • #2: What is Loopt?
  • #3: App for various cell phonesfriends around you answer/see structured questions at places
  • #4: No test wo/ source controlMercurialNice w/ all tools consolidated =&gt; code reviews
  • #5: Besides code, keep DB changes in MercurialExtends SQL Manager
  • #6: Used to use Nunit, but much simpler with integrated env
  • #7: Click specific build and see changeset
  • #8: Problem; flaky tests bc invoke 3rd party code =&gt; functional test
  • #9: To explain next tool, need to provide some background
  • #10: Bad practice, but even with lazy data access, still need the database
  • #11: Another class of code, hard to testGoing hit Groupon and no control
  • #12: Address issues we started using DIAsk for what you need
  • #13: Now you control the WebClientSeparate object graph from logic
  • #14: Ends up happening =&gt; construct all dependencies in root app
  • #15: Construct cascading list of dependencies =&gt; cumbersome =&gt; NinjectReflect over adapter =&gt; webClient
  • #16: No magic.When figures you need ILooptWebClient =&gt; need binding for implementation
  • #17: In doing DI =&gt; test classes =&gt; Moq frameworkMock LooptWebClient =&gt; describe what to return
  • #18: To get these framework =&gt;NuGet, VS extensionAdd reference =&gt; add from 3rd party software lib
  • #19: Diff kind of test =&gt; monitoring.Once deployed =&gt; index log files =&gt; search able via Splunk
  • #20: Picked key benchmarks from Splunk =&gt; dashboard via Gecko BoardIn the hallway for all engineers