在没有Visual Studio的情况下在“Web测试”中传递持票人令牌?

时间:2016-10-21 15:21:00

标签: visual-studio visual-studio-2015 fiddler azure-application-insights

我想在Azure的Application Insights可用性功能中导入“.webtest”。我没有Visual Studio的测试版,但是this MSDN article建议使用Fiddler作为创建Web测试的另一个选项。

我需要在REST API上执行2个请求:

  1. connect/token端点请求承载令牌。
  2. 使用标头中的承载令牌(从上述请求中检索)在api/resources执行GET。
  3. 这是典型的客户端凭证OAuth 2流程。

    我似乎无法弄清楚如何用Fiddler做到这一点。基本上我需要从请求1的响应主体中提取一个值,并将其用作请求2中的标头值。

    这是Web测试在不传递令牌的情况下的样子:

    <?xml version="1.0" encoding="utf-8"?>
    <TestCase Name="FiddlerGeneratedWebTest" Id="" Owner="" Description="" Priority="0" Enabled="True" CssProjectStructure="" CssIteration="" DeploymentItemsEditable="" CredentialUserName="" CredentialPassword="" PreAuthenticate="True" Proxy="" RequestCallbackClass="" TestCaseCallbackClass="">
      <Items>
        <Request Method="POST" Version="1.1" Url="https://example.com/connect/token" ThinkTime="8" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
          <Headers>
            <Header Name="Content-Type" Value="application/x-www-form-urlencoded" />
          </Headers>
          <FormPostHttpBody ContentType="application/x-www-form-urlencoded">
            <FormPostParameter Name="client_id" Value="myclientid" UrlEncode="True" />
            <FormPostParameter Name="client_secret" Value="password123" UrlEncode="True" />
            <FormPostParameter Name="grant_type" Value="client_credentials" UrlEncode="True" />
            <FormPostParameter Name="scope" Value="myscopes" UrlEncode="True" />
          </FormPostHttpBody>
        </Request>
        <Request Method="GET" Version="1.1" Url="https://example.com/api/resources" ThinkTime="0" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
          <Headers>
            <Header Name="Authorization" Value="Bearer {{token}}" />
          </Headers>
        </Request>
      </Items>
    </TestCase>
    

2 个答案:

答案 0 :(得分:2)

假设以下面的示例返回,您可以使用正则表达式提取来获取它。

{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3600 ... "access_token":"{{TOKEN}}", ...}

<?xml version="1.0" encoding="utf-8"?>
<TestCase Name="FiddlerGeneratedWebTest" Id="" Owner="" Description="" Priority="0" Enabled="True" CssProjectStructure="" CssIteration="" DeploymentItemsEditable="" CredentialUserName="" CredentialPassword="" PreAuthenticate="True" Proxy="" RequestCallbackClass="" TestCaseCallbackClass="">
  <Items>
    <Request Method="POST" Version="1.1" Url="https://example.com/connect/token" ThinkTime="8" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
      <ExtractionRules>
            <ExtractionRule Classname="Microsoft.VisualStudio.TestTools.WebTesting.Rules.ExtractRegularExpression, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" VariableName="token" DisplayName="Extract Regular Expression" Description="Extract text from the response matching a regular expression and place it into the test context.">
              <RuleParameters>
                <RuleParameter Name="RegularExpression" Value=".*&quot;access_token&quot;:&quot;([^&quot;]*)&quot;.*" />
                <RuleParameter Name="IgnoreCase" Value="True" />
                <RuleParameter Name="Required" Value="True" />
                <RuleParameter Name="Index" Value="0" />
                <RuleParameter Name="HtmlDecode" Value="True" />
                <RuleParameter Name="UseGroups" Value="True" />
              </RuleParameters>
            </ExtractionRule>
      </ExtractionRules>
      <Headers>
        <Header Name="Content-Type" Value="application/x-www-form-urlencoded" />
      </Headers>
      <FormPostHttpBody ContentType="application/x-www-form-urlencoded">
        <FormPostParameter Name="client_id" Value="myclientid" UrlEncode="True" />
        <FormPostParameter Name="client_secret" Value="password123" UrlEncode="True" />
        <FormPostParameter Name="grant_type" Value="client_credentials" UrlEncode="True" />
        <FormPostParameter Name="scope" Value="myscopes" UrlEncode="True" />
      </FormPostHttpBody>
    </Request>
    <Request Method="GET" Version="1.1" Url="https://example.com/api/resources" ThinkTime="0" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
      <Headers>
        <Header Name="Authorization" Value="Bearer {{token}}" />
      </Headers>
    </Request>
  </Items>
</TestCase>

答案 1 :(得分:0)

满意James Davis的答案,如果您需要通过发布JSON 登录到https://yourapp.com/auth/login

{
  user: 'youruser', 
  password: 'yourpassword'
}

第一个base64编码json:

> echo "{user: 'youruser', password: 'yourpassword'}" | base64
e3VzZXI6ICd5b3VydXNlcicsIHBhc3N3b3JkOiAneW91cnBhc3N3b3JkJ30K

然后在StringHttpBody标记中传递此base64值

<?xml version="1.0" encoding="utf-8"?>
<WebTest Name="login-healthcheck" Id="e91b6e1d-3fa0-475f-a18b-b694b463589c" Owner="" Priority="0" Enabled="True" CssProjectStructure="" CssIteration="" Timeout="0" WorkItemIds="" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010" Description="" CredentialUserName="" CredentialPassword="" PreAuthenticate="True" Proxy="default" StopOnError="False" RecordedResultFile="" ResultsLocale="">
  <Items>
    <Request Method="POST" Guid="ef9d1d00-5663-476a-a3cb-ccf49c4d2229" Version="1.1" Url="https://yourapp.com/auth/login" ThinkTime="8" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8" ExpectedHttpStatusCode="0" ExpectedResponseUrl="" ReportingName="" IgnoreHttpStatusCode="False">
      <Headers>
        <Header Name="Content-Type" Value="application/json" />
      </Headers>
      <ExtractionRules>
        <ExtractionRule Classname="Microsoft.VisualStudio.TestTools.WebTesting.Rules.ExtractRegularExpression, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" VariableName="token" DisplayName="Extract Regular Expression" Description="Extract text from the response matching a regular expression and place it into the test context.">
          <RuleParameters>
            <RuleParameter Name="RegularExpression" Value=".*&quot;access_token&quot;:&quot;([^&quot;]*)&quot;.*" />
            <RuleParameter Name="IgnoreCase" Value="True" />
            <RuleParameter Name="Required" Value="True" />
            <RuleParameter Name="Index" Value="0" />
            <RuleParameter Name="HtmlDecode" Value="True" />
            <RuleParameter Name="UseGroups" Value="True" />
          </RuleParameters>
        </ExtractionRule>
      </ExtractionRules>
      <StringHttpBody ContentType="application/json" InsertByteOrderMark="False">e3VzZXI6ICd5b3VydXNlcicsIHBhc3N3b3JkOiAneW91cnBhc3N3b3JkJ30K</StringHttpBody>
    </Request>
    <Request Method="GET" Guid="d566422f-af74-47bf-90aa-0c66db6ef567" Version="1.1" Url="https://yourapp.com/api/v1/healthcheck" ThinkTime="0" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8" ExpectedHttpStatusCode="0" ExpectedResponseUrl="" ReportingName="" IgnoreHttpStatusCode="False">
      <Headers>
        <Header Name="Authorization" Value="Bearer {{token}}" />
      </Headers>
    </Request>
  </Items>
</WebTest>

为我完成了Azure Application Insights可用性检查

相关问题