Mixing automated and manual testing (Part 2) : Part 1
This is a two part post on mixing automated and manual testing. In short, I cover solutions to two problems:
- Converting selenium tests to end-to-end unit tests
- Reporting end-to-end test via test case management software integration
Test Case Management Software Integration
In my previous post, I gave a few tips on transforming end-to-end selenium test into automated unit tests. This post will be more technical as it covers how to integrate your automated end-to-end selenium-based unit tests into your Test Case Management (TCM) software. TCM software allows manual testers to create test cases, suites, and runs to track the results of manual testing. It’s a great tool when your team needs to do a lot of manual testing. In this example, I’m going to integrate with TestRail.
There are quite a few neat tricks to do this:
- Get the names of your unit tests
- Add new test run with test cases
- Update the run’s test case at the end of each test
Get the names of all test case
Get the test names is a matter of inspecting all methods in the assembly with the TestMethod attribute
public List<string> GetAllTestMethods()
{
var methods = this.GetType().Assembly.GetTypes()
.SelectMany(t => t.GetMethods())
.Where(m => m.GetCustomAttributes(typeof(TestMethodAttribute), false).Length > 0)
.ToArray();
var retval = new List<string>();
foreach (var method in methods)
{
retval.Add(method.Name.Replace("Void","").Replace("()",""));
}
return retval;
}
Add new test run with test cases
In this example, I’m using a testRailClient which wraps the REST API methods. Here, I’m doing the following:
- Deleting the e2e (end-to-end) test case section
- A section is a logical grouping of test cases
- Creating a new e2e section
- Adding the new cases to the e2e section
- Creating a new e2e run with the current timestamp
- Adding all the e2e test cases to the run.
- Finally, getting a reference to all TestRail run cases.
public void AddMissingCases()
{
var methodNames = GetAllTestMethods();
var sections = testRailClient.GetSections(1, 1);
var section = sections.First(x => x.Name == "e2e");
testRailClient.DeleteSection(oldSection.ID.Value);
var section = testRailClient.AddSection(1, 1, "e2e");
var cases = testRailClient.GetCases(1, 1, section.ID.Value);
bool changed = false;
foreach (var methodName in methodNames)
{
if (cases.All(x => x.Title != methodName))
{
testRailClient.AddCase(section.ID.Value, methodName);
changed = true;
}
}
if (changed)
cases = testRailClient.GetCases(1, 1, section.ID.Value);
var casesToRun = cases.Select(x => x.ID.Value);
var hs = new HashSet<ulong>(casesToRun);
var hs = new HashSet<ulong>() {casesToRun.First() };
var res = testRailClient.AddRun(1, 1, "e2e - " + DateTime.Now, "", 0, null);
if (!res.WasSuccessful)
{
throw new Exception("Unable to create Test Run",res.Exception);
}
var update = testRailClient.UpdateRun(res.Value, null, null, null, hs);
allTests = testRailClient.GetTests(res.Value);
}
Update the run’s test case at the end of each test
MSTest has a great feature where you can inspect the TestContext in the TestCleanup method to get the overall result at the end of each test. It’s here that I update TestRail
private TestContext testContext;
public TestContext TestContext
{
get { return this.testContext; }
set { this.testContext = value; }
}
[TestCleanup]
public void CleanUp()
{
var methodName = TestContext.TestName;
bool fail = TestContext.CurrentTestOutcome == UnitTestOutcome.Failed;
AddTestResult(fail,methodName);
testRailClient = null;
}
protected void AddTestResult(bool fail, string methodName)
{
var test = allTests.First(x => x.Title == methodName);
var result = testRailClient.AddResult(test.ID.Value, fail ? ResultStatus.Failed : ResultStatus.Passed);
}
I hope you find this helpful. It’s useful to integrate your end-to-end automated tests into your TCM software.
- Everything is a P1 - July 22, 2020
- The Danger of Agenda-less Meetings - April 21, 2020
- Strictly Agile - February 12, 2018

