<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/Python/</link>
    <description>Recent content in Python on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Wed, 02 Jul 2025 09:45:48 +0800</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/Python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>WebAssembly Spec 浅析和跨语言实践</title>
      <link>https://www.yeqown.xyz/2025/07/02/WebAssemblySpec%E6%B5%85%E6%9E%90%E5%92%8C%E8%B7%A8%E8%AF%AD%E8%A8%80%E5%AE%9E%E8%B7%B5/</link>
      <pubDate>Wed, 02 Jul 2025 09:45:48 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2025/07/02/WebAssemblySpec%E6%B5%85%E6%9E%90%E5%92%8C%E8%B7%A8%E8%AF%AD%E8%A8%80%E5%AE%9E%E8%B7%B5/</guid>
      <description>&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;本文主要聚焦于 WebAssembly 的核心规范（Core Spec）部分。WASI 和 Embedder Spec 等其他部分并非本文的重点，感兴趣的读者可自行查阅相关资料。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;img src=&#34;https://www.yeqown.xyz/images/wasm/intro.png&#34;&gt;&#xA;&lt;h2 id=&#34;目的&#34;&gt;目的&lt;a class=&#34;anchor&#34; href=&#34;#%e7%9b%ae%e7%9a%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;随着 Web 技术的普及，越来越多的应用场景（如游戏、音视频处理、AI 等）需要在浏览器中运行。这些场景通常涉及 CPU 密集型任务，而现有 Web 引擎在处理此类任务时，性能仍不及原生语言。此外，C/C++ 等语言已积累了大量成熟的库，为了高效复用这些库以扩展 Web 的能力，急需一种新方式，使 C++/Rust 等语言也能在浏览器环境中运行。&lt;/p&gt;&#xA;&lt;p&gt;为解决上述问题，W3C 提出了 WebAssembly 规范。该规范设计了一种全新的、与机器无关的汇编指令集、运行时（可理解为虚拟机）以及内存模型等。&lt;/p&gt;&#xA;&lt;p&gt;WebAssembly 规范发布后，各大浏览器厂商迅速跟进支持，使其成为一种跨平台的二进制格式，能够在不同操作系统和硬件平台上运行。WASM 的应用范围也因此不再局限于 Web 场景，而是扩展到移动端、服务器端等领域。在云原生领域，Envoy、Kong 和 Apisix 等项目已支持 WASM 作为其扩展插件。WasmEdge 更进一步，直接提出将 WASM 应用于边缘计算场景，例如无服务器应用和函数即服务等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;核心概念&#34;&gt;核心概念&lt;a class=&#34;anchor&#34; href=&#34;#%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在最新规范中，WebAssembly 定义了以下核心概念：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;概念&lt;/th&gt;&#xA;          &lt;th&gt;解释说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Values&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;提供四种基础数值类型：32位和64位的整型及浮点型。32位整型可用于表示布尔值或内存地址。另有128位扩展整型用于高精度计算。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Instructions&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;基于栈式虚拟机执行的指令，分为简单指令和控制指令两类。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Traps&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;类似异常机制，当发生非法操作（如越界访问）时立即中止执行并报告宿主环境。功能类似于Go/Rust中的panic。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Functions&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;与其他编程语言一致，用于组织特定功能的代码，接收参数并返回结果。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Tables&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;数据结构上是一个数组，用于存储特定类型（&lt;code&gt;funcref&lt;/code&gt;和&lt;code&gt;externref&lt;/code&gt;），可通过索引模拟函数指针。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Linear Memory&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;一段可动态增长的连续字节数组，程序可存储和加载其中任意位置的数据，越界访问会触发Trap。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Modules&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;包含类型、函数、表、内存和全局变量的定义，作为部署、加载和编译的基本单位。可声明导入导出项，并支持定义自动执行的启动函数。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Embedder&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;指将WebAssembly程序嵌入宿主环境的实现方式，如wasmtime或Web环境中的WebAssembly运行时。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/wasm/concepts.png&#34;&gt;&#xA;&lt;h2 id=&#34;举例分析&#34;&gt;举例分析&lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%be%e4%be%8b%e5%88%86%e6%9e%90&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;接下来，我们将结合一个简单的 WASM 程序来辅助理解 WebAssembly 规范的内容。这里使用 Rust 语言编写一个简单的加法程序，并将其编译为 WASM 模块：&lt;/p&gt;</description>
    </item>
    <item>
      <title>自己写一个手机菜谱APP</title>
      <link>https://www.yeqown.xyz/2018/05/18/%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E6%89%8B%E6%9C%BA%E8%8F%9C%E8%B0%B1APP/</link>
      <pubDate>Fri, 18 May 2018 12:38:14 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/05/18/%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E6%89%8B%E6%9C%BA%E8%8F%9C%E8%B0%B1APP/</guid>
      <description>&lt;p&gt;需要的技术及工具：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Python3 + Selenuium&lt;/li&gt;&#xA;&lt;li&gt;Golang net/http&lt;/li&gt;&#xA;&lt;li&gt;React-Native 相关（使用了react-navigation）&lt;/li&gt;&#xA;&lt;li&gt;MongoDB&lt;/li&gt;&#xA;&lt;li&gt;Redis&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;代码地址：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/yeqown/recipe&#34;&gt;github.com/yeqown/recipe&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;项目构思及构成&#34;&gt;项目构思及构成&lt;a class=&#34;anchor&#34; href=&#34;#%e9%a1%b9%e7%9b%ae%e6%9e%84%e6%80%9d%e5%8f%8a%e6%9e%84%e6%88%90&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;食谱类型的App，应用市场肯定有更好的的食谱APP。所以自己开发的目的，首先是写代码，其次是定制APP～&#xA;好的，现在化身产品经理，设计一下APP有哪些功能：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每日菜谱推荐，推荐可更换&lt;/li&gt;&#xA;&lt;li&gt;每天需要准备的材料提醒&lt;/li&gt;&#xA;&lt;li&gt;发现更多菜谱&lt;/li&gt;&#xA;&lt;li&gt;分类筛选菜谱&lt;/li&gt;&#xA;&lt;li&gt;搜索菜谱&lt;/li&gt;&#xA;&lt;li&gt;查看菜谱详情&lt;/li&gt;&#xA;&lt;li&gt;设置（不知道设置啥，提前准备吧）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;设计稿？不存在的，随心所欲。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;现在分析下我需要做的事情：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;能跑起来的APP，与restful web api 交互。&lt;/li&gt;&#xA;&lt;li&gt;能跑起来的web-api，提供菜谱数据，筛选，推荐，搜索等功能&lt;/li&gt;&#xA;&lt;li&gt;能跑起来的简易spider，从网上获取菜谱信息。（这个爬虫能解析动态生成网站就够用了，姑且称之为爬虫吧）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;没有考虑大量数据，因此爬虫并不通用，只适合特定XX网站。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h3 id=&#34;实战爬虫&#34;&gt;实战爬虫&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%9e%e6%88%98%e7%88%ac%e8%99%ab&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;这个APP里面最重要的就是菜谱数据了，那么开发之前，需要明确的数据格式，如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cat&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cat&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;img&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;img_url&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;mark_cnt&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;19101&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;view_cnt&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;181891&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;setps&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;desc&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;img&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// more step&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;material&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ingredients&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ingredients_name&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ingredients_weight&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// more ingredients&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;seasoning&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;seasoning_name&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;seasoning_weight&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// more seasoning&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;create_time&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2018xxxxxx&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;update_time&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2018xxxxxx&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;目标&#34;&gt;目标&lt;a class=&#34;anchor&#34; href=&#34;#%e7%9b%ae%e6%a0%87&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;前提：无法直接获取到该网站的服务API，才使用爬虫间接获取数据。&lt;/p&gt;</description>
    </item>
    <item>
      <title>docker&#43;selenium&#43;python构建前端自动化分布式测试环境</title>
      <link>https://www.yeqown.xyz/2018/01/23/docker-selenium-python%E6%9E%84%E5%BB%BA%E5%89%8D%E7%AB%AF%E8%87%AA%E5%8A%A8%E5%8C%96%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/</link>
      <pubDate>Tue, 23 Jan 2018 11:07:08 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/23/docker-selenium-python%E6%9E%84%E5%BB%BA%E5%89%8D%E7%AB%AF%E8%87%AA%E5%8A%A8%E5%8C%96%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/</guid>
      <description>&lt;p&gt;docker + selenium + python 构建前端自动化分布式测试环境。利用seleninum-grid分布式框架，python编写测试代码，docker部署来进行前端自动化测试&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;2018-2-1 更新 &lt;a href=&#34;#%e4%bd%bf%e7%94%a8docker-compose%e7%bc%96%e6%8e%92&#34;&gt;使用docker-compose编排&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;分布式部署的优点&#34;&gt;分布式部署的优点&lt;a class=&#34;anchor&#34; href=&#34;#%e5%88%86%e5%b8%83%e5%bc%8f%e9%83%a8%e7%bd%b2%e7%9a%84%e4%bc%98%e7%82%b9&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;自动化的优缺点就不再重复了，主要分析下docke部署和分布式的优势&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提高自动化的测试效率（分布式）&lt;/li&gt;&#xA;&lt;li&gt;方便打包和持续集成（docker）&lt;/li&gt;&#xA;&lt;li&gt;解决多人coding，却因为路径不一致导致无法运行的问题（当然也可以通过其他方式来解决～）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这里还有一个问题就是：使用docker部署方式运行测试代码，是看不见本地浏览器启动的，因此在调试测试代码的时候，需要一定的工具来协助，譬如&lt;a href=&#34;https://www.realvnc.com/en/connect/download/viewer/&#34;&gt;VNC viewer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;开篇-selenium&#34;&gt;开篇-selenium&lt;a class=&#34;anchor&#34; href=&#34;#%e5%bc%80%e7%af%87-selenium&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;大家都知道 Selenium 是支持多种浏览器多个编程语言的一个自动化测试工具。而 Selenium Grid 是一种可以让用户在不同的环境和不同的浏览器上并行运行 web 测试用例的框架。换而言之，使用 Selenium Grid 可以让我们在分布式测试环境下执行测试，例如 Windows，Linux，Mac OS，Andoid/iOS 等等，这样可以大大减少重复的工作量，提高我们的工作效率。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;selenium分布式结构如图：&#xA;&lt;img src=&#34;https://www.ibm.com/developerworks/cn/opensource/os-cn-docker-selenium-grid-test/image001.png&#34; alt=&#34;selunium-grid&#34; /&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;搭建分布式环境&#34;&gt;搭建分布式环境&lt;a class=&#34;anchor&#34; href=&#34;#%e6%90%ad%e5%bb%ba%e5%88%86%e5%b8%83%e5%bc%8f%e7%8e%af%e5%a2%83&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;在Dockerhub已经具有了相应的selenium的镜像，我们直接使用就行了&lt;/p&gt;&#xA;&lt;h4 id=&#34;拉取镜像&#34;&gt;拉取镜像&lt;a class=&#34;anchor&#34; href=&#34;#%e6%8b%89%e5%8f%96%e9%95%9c%e5%83%8f&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull selenium/hub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull selenium/node-chorme-debug&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关于&lt;code&gt;node-chrome-debug&lt;/code&gt;和&lt;code&gt;node-chrome&lt;/code&gt;的区别：&#xA;暂未研究&lt;/p&gt;&#xA;&lt;h4 id=&#34;运行容器&#34;&gt;运行容器&lt;a class=&#34;anchor&#34; href=&#34;#%e8%bf%90%e8%a1%8c%e5%ae%b9%e5%99%a8&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -d -p 4444:4444 --name sel-hub selunium/hub # 运行hub服务&#xA;docker run -d -p 5900:5900 --link sel-hub:hub selunium/node-chrome-debug # 运行slenium chrome 节点&#xA;# more node could append like node-chrome-debug&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;查看节点信息&#34;&gt;查看节点信息&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9f%a5%e7%9c%8b%e8%8a%82%e7%82%b9%e4%bf%a1%e6%81%af&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;在浏览器中打开&lt;a href=&#34;http://127.0.0.1:4444/grid/console&#34;&gt;http://127.0.0.1:4444/grid/console&lt;/a&gt;&#xA;这里需要注意的是，如果是在本地运行的容器，并映射4444端口，因此得到127.0.0.1:4444，如果是在虚拟机中运行，ip和端口应该根据网络来获取相应的IP和PORT&lt;/p&gt;</description>
    </item>
    <item>
      <title>pytest用法小结</title>
      <link>https://www.yeqown.xyz/2018/01/13/pytest%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/</link>
      <pubDate>Sat, 13 Jan 2018 15:20:50 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/13/pytest%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93/</guid>
      <description>&lt;p&gt;pytest最常用法总结，当然不止这一点功能。关于更多更强大的插件，可以根据自己需要来定制。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;pytest 安装和使用都非常简单, 只需&lt;code&gt;pip install pytest&lt;/code&gt;&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;h3 id=&#34;编写测试代码&#34;&gt;编写测试代码&lt;a class=&#34;anchor&#34; href=&#34;#%e7%bc%96%e5%86%99%e6%b5%8b%e8%af%95%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;使用pytest，不需要像unittest模块一样，pytest使用的是python自带的&lt;code&gt;assert&lt;/code&gt;，如：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;test_global_function&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;h3 id=&#34;使用pytestmark&#34;&gt;使用pytest.mark&lt;a class=&#34;anchor&#34; href=&#34;#%e4%bd%bf%e7%94%a8pytestmark&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;pytest.mark 用于给测试方法打上标签，在稍后的执行中会讲到如何使用marker&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@pytest.mark.marker_self&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;test_global_function&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;h3 id=&#34;使用pytestfixture&#34;&gt;使用pytest.fixture&lt;a class=&#34;anchor&#34; href=&#34;#%e4%bd%bf%e7%94%a8pytestfixture&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;/blockquote&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@pytest.fixture&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;google_url&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://google.com&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;h3 id=&#34;setup-和-teardown&#34;&gt;setup 和 teardown&lt;a class=&#34;anchor&#34; href=&#34;#setup-%e5%92%8c-teardown&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;setup&lt;/code&gt;和&lt;code&gt;teardown&lt;/code&gt;方法作用范围，分为全局作用，类作用，方法作用&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;全局：作用于全局测试&lt;strong&gt;函数&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;类： 作用于&lt;strong&gt;自身类&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;类方法： 作用于&lt;strong&gt;类函数&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;简单举例&#34;&gt;&lt;strong&gt;简单举例:&lt;/strong&gt;&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ae%80%e5%8d%95%e4%b8%be%e4%be%8b&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 全局&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setup_function&lt;/span&gt;(function):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;setup function global&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teardown_function&lt;/span&gt;(function):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;teardown function global&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 类&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Test_fixture&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@classmethod&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setup_class&lt;/span&gt;(cls):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;class setup method&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@classmethod&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teardown_class&lt;/span&gt;(cls):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;class teardown method&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 类方法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setup_method&lt;/span&gt;(self, method):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;class method setup function&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;teardown_method&lt;/span&gt;(self, method):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;class method teardown function&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;h3 id=&#34;pytest配置文件&#34;&gt;pytest配置文件&lt;a class=&#34;anchor&#34; href=&#34;#pytest%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;配置文件名为&lt;code&gt;pytest.ini&lt;/code&gt; &lt;code&gt;setup.cfg&lt;/code&gt; &lt;code&gt;tox.ini&lt;/code&gt; &lt;em&gt;关于配置文件优先级请查阅官方文档&lt;/em&gt;&#xA;简单举例：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
