Index: django/django/test/client.py
===================================================================
--- django/django/test/client.py	(revision 10054)
+++ django/django/test/client.py	(working copy)
@@ -20,6 +20,7 @@
 from django.utils.http import urlencode
 from django.utils.itercompat import is_iterable
 from django.db import transaction, close_connection
+from django.test.utils import ContextList
 
 BOUNDARY = 'BoUnDaRyStRiNg'
 MULTIPART_CONTENT = 'multipart/form-data; boundary=%s' % BOUNDARY
@@ -81,7 +82,7 @@
     Stores templates and contexts that are rendered.
     """
     store.setdefault('template',[]).append(template)
-    store.setdefault('context',[]).append(context)
+    store.setdefault('context',ContextList()).append(context)
 
 def encode_multipart(boundary, data):
     """
Index: django/django/test/utils.py
===================================================================
--- django/django/test/utils.py	(revision 10054)
+++ django/django/test/utils.py	(working copy)
@@ -6,6 +6,18 @@
 from django.template import Template
 from django.utils.translation import deactivate
 
+class ContextList(list):
+    
+    def __getitem__(self, key):
+        if type(key) == str:
+            for subcontext in self:
+                if key in subcontext:
+                    return subcontext[key]
+            raise KeyError
+        else:
+            return super(ContextList, self).__getitem__(key)
+            
+
 def instrumented_test_render(self, context):
     """
     An instrumented Template render method, providing a signal
Index: django/docs/topics/testing.txt
===================================================================
--- django/docs/topics/testing.txt	(revision 10054)
+++ django/docs/topics/testing.txt	(working copy)
@@ -710,7 +710,9 @@
         produced the response content.
 
         If the rendered page used multiple templates, then ``context`` will be a
-        list of ``Context`` objects, in the order in which they were rendered.
+        list of ``Context`` objects, in the order in which they were rendered. Regardless
+        of the number of templates used, context variables can be directly accessed from this
+        attribute without looking in each ``Context`` object.
 
     .. attribute:: request
 
Index: django/tests/regressiontests/test_client_regress/context_templates/extended.html
===================================================================
--- django/tests/regressiontests/test_client_regress/context_templates/extended.html	(revision 0)
+++ django/tests/regressiontests/test_client_regress/context_templates/extended.html	(revision 0)
@@ -0,0 +1,5 @@
+{% extends "base.html" %}
+{% block title %}Extended template{% endblock %}
+{% block content %}
+This is just a template extending the base.
+{% endblock %}
\ No newline at end of file
Index: django/tests/regressiontests/test_client_regress/models.py
===================================================================
--- django/tests/regressiontests/test_client_regress/models.py	(revision 10054)
+++ django/tests/regressiontests/test_client_regress/models.py	(working copy)
@@ -455,6 +455,27 @@
         url = reverse('arg_view', args=['somename'])
         self.assertEquals(url, '/test_client_regress/arg_view/somename/')
 
+class ContextTests(TestCase):
+    fixtures = ['testdata']
+
+    def setUp(self):
+        self.old_templates = settings.TEMPLATE_DIRS
+        settings.TEMPLATE_DIRS += (os.path.join(os.path.dirname(__file__), 'context_templates'),)
+
+    def tearDown(self):
+        settings.TEMPLATE_DIRS = self.old_templates
+        
+    def test_context(self):
+        # Without template inheritance
+        response = self.client.get("/test_client_regress/request_data/", data={'foo':'whiz'})
+        self.assertEqual(response.context['get-foo'], 'whiz')
+        self.assertEqual(response.context['request-foo'], 'whiz')
+        
+        # With template inheritance
+        response = self.client.get("/test_client_regress/request_data_extended/", data={'foo':'whiz'})
+        self.assertEqual(response.context['get-foo'], 'whiz')
+        self.assertEqual(response.context['request-foo'], 'whiz')
+
 class SessionTests(TestCase):
     fixtures = ['testdata.json']
 
Index: django/tests/regressiontests/test_client_regress/urls.py
===================================================================
--- django/tests/regressiontests/test_client_regress/urls.py	(revision 10054)
+++ django/tests/regressiontests/test_client_regress/urls.py	(working copy)
@@ -7,6 +7,7 @@
     (r'^staff_only/$', views.staff_only_view),
     (r'^get_view/$', views.get_view),
     (r'^request_data/$', views.request_data),
+    (r'^request_data_extended/$', views.request_data, {'template':'extended.html'}),
     url(r'^arg_view/(?P<name>.+)/$', views.view_with_argument, name='arg_view'),
     (r'^login_protected_redirect_view/$', views.login_protected_redirect_view),
     (r'^redirects/$', redirect_to, {'url': '/test_client_regress/redirects/further/'}),
Index: django/tests/regressiontests/test_client_regress/views.py
===================================================================
--- django/tests/regressiontests/test_client_regress/views.py	(revision 10054)
+++ django/tests/regressiontests/test_client_regress/views.py	(working copy)
@@ -19,9 +19,9 @@
     return HttpResponse("Hello world")
 get_view = login_required(get_view)
 
-def request_data(request):
+def request_data(request, template='base.html'):
     "A simple view that returns the request data in the context"
-    return render_to_response('base.html', {
+    return render_to_response(template, {
         'get-foo':request.GET.get('foo',None),
         'get-bar':request.GET.get('bar',None),
         'post-foo':request.POST.get('foo',None),
