Create Actionable Bugs


Now that Visual Studio Team System 2010 Beta 1 is released, let’s talk about some of the cool features it has in test area.  We will start with taking about the ability to easily create actionable bugs:

Create actionable bugs: The problem of no-repro is a big issue between developers & testers. Testers spend enormous amount of time finding and reporting a bug, but many of the bugs are rejected by developers because the information in the bug report is not comprehensive enough, or they can’t reproduce the bugs on their systems. Microsoft Test and Lab Manager (MTLM) goes a long way in solving this problem. Let us see how:

Once you create a manual test case  in Microsoft Test and Lab manager, you can run it.  Test case(s) will be loaded in Test Runner activity of MTLM.  Start by clicking on “Start Test”. 

clip_image002

You can follow the steps defined in the test case to test the your Application Under Test (AUT). As you test your app, mark the step in Test Runner as “Pass” as appropriate.  Once you find an issue in the application under test, mark the step as “Fail”. 

clip_image004

At this point testers normally open the bug form and start typing the repro steps etc.  However, as you are using the Microsoft Test and Lab Manager, let’s see how it makes your job easy.  In the bottom pane of the Test Runner, add any comments about the issue you found while testing this step.  Now let’s attach a screenshot to prove that you have actually seen the issue.  From the Test Steps tool bar, click on the camera icon & take a snapshot of the AUT (you can take a screenshot of the rectangular area/window/complete screen).  The screenshot gets automatically attached to the step.

clip_image006

Now let us submit the bug.  Click on the New bug button on the toolbar.

clip_image008

It opens up a TFS bug form.  Notice that some of the required fields are automatically filled for you.  Also in the bottom tab of the bug form repro steps have been captured (including information about what steps you had passed/failed). Any comments/screenshots are also attached to the step. 

clip_image010

The second column has detailed actions, open any section & see that it has captured detailed user actions (yes each and every UI action).  If you had configured video recording in test settings, you will see video links for every action in third column.  Now the developer can see exactly what was done in the application before the bug was found.

The System info tab has automatically collected information about the system on which you were running the app. 

clip_image012

The test case tab has a link that has been automatically created between this bug & the test case.

The “Other links” tab has many other useful links (depending on the test settings).  E.g. it has the links to the action log file, video of testing, historical debugging log, event log etc.

clip_image014

You can add title to the bug and save it.  That’s it; you have created a rich actionable bug and the chances are that it won’t come back to you as non-repro. 

Comments (3)

  1. Thank you for submitting this cool story – Trackback from DotNetShoutout

  2. Bob says:

    Found bug that crashes Visual Studio 2010 Test Manager consistantly.  Need someone to forward to however is in 2010 Test Manager development.  I can document steps if need be.  Crash report:

    System.Reflection.TargetInvocationException was unhandled

     Message=Exception has been thrown by the target of an invocation.

     Source=mscorlib

     StackTrace:

          at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)

          at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)

          at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)

          at System.Delegate.DynamicInvokeImpl(Object[] args)

          at System.Windows.RoutedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)

          at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)

          at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)

          at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)

          at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)

          at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)

          at Xceed.Wpf.DataGrid.DataGridControl.OnSelectionChanged(DataGridSelectionChangedEventArgs e)

          at Xceed.Wpf.DataGrid.SelectionManager.End()

          at Xceed.Wpf.DataGrid.DataGridContext.DoSingleSelection(Object item)

          at Xceed.Wpf.DataGrid.DataGridContext.UpdateSelection()

          at Xceed.Wpf.DataGrid.DataGridContext.SetCurrent(Object item, ColumnBase column, Boolean forceFocus)

          at Xceed.Wpf.DataGrid.Cell.OnMouseLeftButtonDown(MouseButtonEventArgs e)

          at System.Windows.UIElement.OnMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)

          at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)

          at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)

          at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)

          at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)

          at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)

          at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)

          at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)

          at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)

          at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)

          at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)

          at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)

          at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)

          at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)

          at System.Windows.Input.InputManager.ProcessStagingArea()

          at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)

          at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)

          at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)

          at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

          at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

          at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

          at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)

          at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)

          at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

          at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)

          at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)

          at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)

          at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)

          at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)

          at System.Windows.Threading.Dispatcher.Run()

          at System.Windows.Application.RunDispatcher(Object ignore)

          at System.Windows.Application.RunInternal(Window window)

          at System.Windows.Application.Run(Window window)

          at Microsoft.TeamFoundation.TestManagement.Shells.WpfShell.SingleInstanceWrapper.Launch(String[] args, Boolean isFirstInstance)

          at Microsoft.VisualStudio.TestTools.Common.SingleInstance.SingleInstanceApplicationManager.Run(String appId, String applicationTitle, LaunchAction action, String[] args)

          at Microsoft.TeamFoundation.TestManagement.Shells.WpfShell.SingleInstanceWrapper.Main(String[] args)

     InnerException: System.ArgumentException

          Message=An item with the same key has already been added.

          Source=mscorlib

          StackTrace:

               at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)

               at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)

               at System.Collections.ObjectModel.KeyedCollection`2.AddKey(TKey key, TItem item)

               at System.Collections.ObjectModel.KeyedCollection`2.InsertItem(Int32 index, TItem item)

               at Microsoft.TeamFoundation.TestManagement.Common.KeyedObservableCollection`2.InsertItem(Int32 index, T item)

               at System.Collections.ObjectModel.Collection`1.Add(T item)

               at Microsoft.TeamFoundation.TestManagement.Controls.TestStepsCustomControl.StepsGrid_SelectionChanged(Object sender, DataGridSelectionChangedEventArgs e)

          InnerException: