7

I need to test some HTTP components in my Delphi app. I use DUnit and want to add some automation into testing.

So my testing code need to start the local HTTP server, configure it (for example, prepare for connection break in 3 seconds, or to simulate low bandwidth, or to ask for login/password etc), run my unit-tests and close HTTP server.

Are there some HTTP servers available exactly for Delphi/DUnit?

I know that Mozilla team have such server, but it's not too easy to integrate it into DUnit.

Andrew
  • 3,696
  • 3
  • 40
  • 71

4 Answers4

10

I use Indy's TIdHttpServer to serve stuff in the same process.

This approach allows me to check that the requests coming in are correct, as well as checking the behaviour from the client end.

Also, you can individually set up the server on a testcase by testcase basis, making your unit tests easier to understand (meaning that you don't have a piece of the 'test' somewhere else).

Nat
  • 5,414
  • 26
  • 38
1

While @Nat's answer is workable, the setup code for stubbing requests and their associated responses using Indy can be pretty heavy. Also, when working in this way, I found the test code to be quite a time drain in both writing and debugging. Hence I built a framework Delphi WebMocks for DUnitX (sorry, not DUnit) to do exactly this with a syntax that should be straight-forward using HTTP terminology.

For example, the setup code is as simple as:

WebMock.StubRequest('GET', '/')
  .ToRespond
  .WithHeader('Content-Type', 'application/json')
  .WithBody('{ "value": 123 }');

You can also verify the requests actually got made like:

WebMock.Assert
  .Post('/')
  .WithHeader('Content-Type', 'application/json')
  .WithBody('{ "value": 123 }')
  .WasRequested;

If the assertion fails, it will fail the DUnitX test.

There is a lot more to it in terms of how you can specify request matching and responses so please check it out if you think you'd find it useful.

R. Hatherall
  • 1,121
  • 14
  • 11
0

You may use unit test / DUnit to construct automatic integration tests. Say, you HTTP components as http client make calls to a Web service. You may make your own mock Web service, or just use any public Web service, like one of those from Google or Amazon. So you just need to create a Google or Amazon developer account, and consume some basic service functions for testing.

ZZZ
  • 2,752
  • 2
  • 25
  • 37
0

If you're testing SOAP services, use SoapUI to stand up a "mock" service based on your WSDL. You can have it return a variety of responses (either sequentially, or use some simple scripting to match responses to the request contents.) I've done this by matching the "request ID" (just a GUID) in my request sent from the DUnit test, to a response in the SoapUI. It's a simple xpath query to match them up.

You can have it return "canned" errors/exceptions, and of course when it's not running, you'll have the "nobody's home" test case.

Chris Thornton
  • 15,620
  • 5
  • 37
  • 62