移动端测试理论(中)

33. Git 代码版本管理工具

Git 与 Github 介绍

  • Git是版本控制工具,Github是个网站(基于Git的,允许你使用Git在Github上做项目)
  • oschina.net ---> 码云(相当于中文版的Github,也是基于Git的)---> 帮助文档里面有Git的介绍,与安装地址 ---> 看pro Git(中文版)文档内容(git.oschina.net/progit/)---> 有windows版本的安装教学
  • Git有自带的图形化界面客户端(GUI)| 但更推荐使用SourceTree.app 来操作,可以用GUI来操作项目的提交更新,也可以用Git命令行来操作

Git下载

https://gitforwindows.org/

Git配置 ($可以不用管)

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
git config --list   # 查看配置信息

Git常用命令

  • 一个项目本质上就是一个文件夹里面又有很多文件夹和文件,假设现在在你电脑桌面有一个叫“项目”文件夹
  • 要通过Git去提交和管理这个项目:
    • 在命令行中,首先要进到这个项目这个文件夹下,“cd ./Desktop/”项目
    • 以后更新一个文件以后,都要重新add一下,再commit

初始化一个git项目(告诉git这个项目让它管理)

git init

查看当前的文件的git的状态
如果提示 “Not a git repository ” 意味着,不是一个git项目,需要使用git init进行初始化
如果提示 “Untracked files ” 意味着,文件没有被追踪

git status

告诉git,管理某个文件(追踪某个文件)

git add <文件名> # 添加一个文件进行追踪
git add . # 添加所有的文件

提交版本

git commit -m "注释"

Sourcetree 安装好后的账户问题

https://blog.csdn.net/jiangyu1013/article/details/78850735

进入这个文件夹:C:\Users\你的电脑名字\AppData\Local\Atlassian\SourceTree , 在此找到或者新建一个 json 类型的文件,取名为:accounts.json。

​ 即:在这个目录下新建一个全名为 accounts.json 的文件。

注意: Windows 系统文件后缀是默认隐藏的,需要先显示文件的后缀名,然后随便新建一个 文本文档 ,将文件全名改为 accounts.json 即可。然后把下面内容复制进去accounts文件中

[
  {
    "$id": "1",
    "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
    "Authenticate": true,
    "HostInstance": {
      "$id": "2",
      "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
      "Host": {
        "$id": "3",
        "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
        "Id": "atlassian account"
      },
      "BaseUrl": "https://id.atlassian.com/"
    },
    "Credentials": {
      "$id": "4",
      "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
      "Username": "",
      "Email": null
    },
    "IsDefault": false
  }
]

重新打开sourcetree
会提示“检测到没有Mxxxxxxx。接下来,会通过以下三种方式进行解决。”
选最后一个,“我不使用”

注册github账号

Github学习网址:https://guides.github.com/activities/hello-world/
打开 github.com
点击 sign up

把代码如何放在github上

Github头像旁边的“+”号,点击会有“New repository” ---> 点击“新建仓库”
“Repository Name” ---> 输入“仓库名称”就是你的项目名字
有个 desc 的描述,可选
后面三个,“readme” “忽略文件” “开源协议(许可证)”, 都不选择。
此处,下一步,会有提示,其中HTTPS旁边会有一个项目链接地址,以后再Sourcetree中就可以通过这个地址来下载到这个项目
使用cmd进入到 需要的提交的项目的目录下。再去使用,提示的命令。(第一次,中途会提示输入github用户名和密码)

git init # 初始化项目

git add . # 把当前目录下的所有文件,交给git管理

git commit -m "first commit" # 提交,这是本地已有一个仓库,可以通过本地的sourcetree来查看项目

git remote add origin https://github.com/hitheima/popopo.git # 建立远端连接

git push -u origin master # 推送到远端,就是把项目上传到github

如何下载github的项目

  • download zip 下载
    • 进入项目主页,右侧有一个绿色的按钮,点击后,选择download zip即可
  • clone 克隆
    • 从远端第一次放到本地的过程叫做克隆(等价于SVN的cheakout)
    • 在github主页上,项目会有一个地址,通过sourceTree进行克隆
    • sourceTree点击新仓库,从url克隆。
    • 将GitHub上的那个“xxxx.git”的地址,赋值到soureceTree中的url中。
    • 选择,存放路径即可。
  • Fork
    • 将别人的项目复制到自己的账户下,但此时已经是两个项目,原来项目的人修改项目,你账户下的项目是不会修改的;同样的,你自己去修改这个项目,别人原项目那里也是没有联系的

PULL

在github也是可以对代码进行修改的,项目组别的成员对代码修改后,重新提交,之后你就要PULL一下
作用,已经本地和远端建立连接的情况下(已经clone过了),将远端的代码,同步到本地。(让本地保持和远端一样)。这个过程叫做pull
在sourceTree中,使用点击“拉取”,点击确定。

切换版本

切换版本,就是可以快速的预览,之前的文件的情况。
在sourceTree中,直接双击你想要查看的以前版本的文件即可。

多次commit后再push

如果本地项目进行修改之后,sourceTree会提示,修改文件的个数。
如果想使用sourceTree进行提交,需要先勾选“暂存的文件”(需要提交什么,就勾选什么。允许部分提交),再去点右上角的“提交”,提交的时候要添加你修改了什么的注释
提交之后,此时远端并不会发生变化。需要进行一次push(推送),让远端同步本地的代码。让远端和本地保持一致。

关于提交时间

提交的时间,以每次commit为准。与push无关。

提交的时候同时推送

在提交写注释的时候,最下方有一个,“立即推送并更变 orgin/master”。
这个选项,表示:提交并且推送到远端

小总结

commit
push
pull
clone
add
init

冲突

冲突发生的情况,在多个人开发中,出现了,同一个文件同一行代码的修改。会产生这个问题。所以会提示,在提交push之前先去pull一下,把远端的版本更新到本地,再去提交push。此时,在pull的时候,就会发生冲突。(当远端的某一个文件的某一行。和本地不同, 并且不是之前的版本)
解决的问题的方法,需要自己权衡。保留或者删除。删除多余的<<<< ===== >>>> 相关信息

以后建议,commit 和 push之前都去pull一下

<<<<<< HEAD
print(1)
======
print(2)
>>>>>> 8ux8vus8fsd8fus8dufs

HEAD部分是自己的代码
远端版本号8ux8vus8fsd8fus8dufs的代码是远端的代码

重新提交commit,并推送push。

34.Allure报告

Allure介绍

    Allure是一个独立的报告插件,生成美观易读的报告,目前支持语言:Java, PHP, Ruby, Python, Scala, C#。

Allure安装

    1.安装pytest的插件包pytest-allure-adaptor: pip3 install pytest-allure-adaptor

Allure帮助文档

    https://docs.qameta.io/allure/#_about

生成Allure报告

    命令行参数:pytest --alluredir report  # 在执行命令目录生成report文件夹,文件夹下包含xml文件

  • 示例
    pytest.ini

    [pytest]
    # --html=./report.html
    # 删除原生--html=./report.html,换成Allure
    addopts = -s --alluredir report
    # 测试路径
    testpaths = ./Test
    # 测试文件名
    python_files = test_*.py
    # 测试类名
    python_classes = Test_*
    # 测试的方法名
    python_functions = test_*

    test_all.py

    class Test_allure:
        def setup(self):
            pass
        def teardown(self):
            pass
        def test_al(self):
            assert 0

    操作步骤:
        1.命令行进入pytest.ini所在目录
        2.输入命令:pytest
    执行结果:
        1.pytest.ini所在目录生成report文件夹,文件夹下生成一个xml文件

allure_xml

xml转html工具安装

mac版本

    1.:brew install allure
    2.进入report上级目录执行命令:allure generate report/ -o report/html
    3.report目录下会生成index.html文件,即为可视化报告

windows版本

    1.下载压缩包allure-2.6.0.zip
        地址:https://bintray.com/qameta/generic/allure2
    2.解压
    3.将压缩包内的bin目录配置到path系统环境变量
    4.进入report上级目录执行命令:allure generate report/ -o report/html --clean
    5.report目录下会生成index.html文件,即为可视化报告

allure_html.png

35.Allure之Pytest

添加测试步骤

    方法:@allure.step(title="测试步骤001")
    示例:
        test_all.py
        import allure, pytest
        class Test_allure:
            def setup(self):
                pass
            def teardown(self):
                pass
            @allure.step('我是测试步骤001')
            def test_al(self, a):
                assert a != 2
allure步骤.png

添加测试描述

    方法:allure.attach('描述', '我是测试步骤001的描述~~~')
    相当于给脚本里面的代码内容加注释,这里第二个参数也可以放图片
    示例:
        test_all.py
        import allure, pytest
        class Test_allure:
            def setup(self):
                pass
            def teardown(self):
                pass
            @allure.step('我是测试步骤001')
            def test_al(self, a):
                allure.attach('描述', '我是测试步骤001的描述~~~')
                assert a != 2
allure步骤描述

添加严重级别

    测试用例设置不同的严重级别,可以帮助测试和开发人员更直观的关注重要Case.
    方法:@pytest.allure.severity(Severity)
    参数:
        Severity:严重级别(BLOCKER,CRITICAL,NORMAL,MINOR,TRIVIAL)
    使用方式:
        @pytest.allure.severity(pytest.allure.severity_level.CRITICAL)
    示例:
        test_all.py
        import allure, pytest
        class Test_allure:
            def setup(self):
                pass
            def teardown(self):
                pass
            @pytest.allure.severity(pytest.allure.severity_level.CRITICAL)
            @allure.step('我是测试步骤001')
            def test_al(self, a):
                allure.attach('描述', '我是测试步骤001的描述~~~')
                assert a != 2
allure严重级别

36.Jenkins安装

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,
    旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
    
    有了Jenkins后期我们只需要写代码,不需要我们再去敲pytest来运行,只要代码传到了Github,
    在Git的管理下,我们更新了代码,Jenkins就会帮我们去编译,有bug时帮我们去发邮件给开发人员。

    一般情况下,公司内部Jenkins安装在服务端,不需要本地安装,都已配置完成,可直接操作使用。
    那么我们之后就要在浏览器输入服务器的地址,而不是localhost本机地址
  • 依赖java环境
    jdk1.5以上

安装jenkins

    1.下载jenkins.war ---> 开启服务用的
    2.进入jenkins.war所在目录,执行:java -jar jenkins.war ---> 开启服务命令
    3.浏览器进入:localhost:8080
    此时在你用户的文件夹下会多了一个.jenkins的文件夹,里面就包括了你用户信息
    还有安装的一些插件信息

安装所需插件

    1.官网下载jenkins安装包
    2.安装完成后,会自动打开页面(若没有可以手动打开浏览器输入:localhost:8080)
    3.进入默认密码提示文件,输入系统默认密码
jenkins安装启动页.png
jenkins初始密码.png
    4.安装建议插件
jenkins建议安装插件.png
jenkins插件安装中.png
    5.设置用户初始化信息
jenkins设置用户信息.png
    6.jenkins启动
jenkins启动.png
    7.jenkins首页
jenkins首页.png

37.Jenkins持续集成配置

Jenkins安装Allure插件

    1.进入jenkins系统管理 -> 管理插件
    2.点击可选插件
    3.搜索框输入Allure Jenkins Plugin
    4.选中安装
    这个插件就相当于,之前我们运行pytest,Allure就会帮我们生成一个xml文件的那个步骤

Jenkins安装Allure Commandline工具

    1.进入jenkins系统管理 -> 全局工具配置
    2.找到Allure Commandline,点击Allure Commandline安装
    3.输入一个别名,在From Maven Central 选择一个Allure版本号
    4.点击新增安装-选择解压/*.ip/*.tar.gz
    5.解压目录选择已下载好的allure2.5.0.zip包所在目录(⚠️ 版本要一致)
    6.点击保存
    这个插件就是用命令行帮我们把xml换成html的文件
allure_commind.png

Jenkins新建一个项目

    1.点击左上角的新建,输入任务名称,选择新建一个自由风格的软件项目 -> 点击确定
    2.输入一些项目描述
    3.选择GitHub project ,监听github上的代码变化
    4.输入Project url # 因我们只是举例,所以使用自己的一个github测试脚本   
J_General.png

源码管理配置

    5.勾选Git
    6.Repository URL输入地址同第四步
    7.点击Add添加github的用户名和密码
J_源码
github用户名密码

构建触发器

  • 我们之前在pycharm的terminal去输入pytest,然后代码运行,实际上就是在构建一个项目,现在我们想Jenkins帮我们去输入pytest的命令,就要先构建触发器
    8.勾选Poll SCM # 根据定时任务,查看github版本是否更新,如果更新会自动构建项目
    9.输入crontab命令
        举例:
            */1 * * * * # 每一分钟检查一次
    10.点击增加构建步骤,mac的话选择Execute shell,
       windows的话选择Execute Windows batch command
    11.接下来,在Command框输入
        mac:
        export PATH=$PATH:"pytest可执行文件的目录"
        pytest
        
        windows:
        PATH=$PATH;"pytest.exe可执行文件的目录"#(到scripts)告诉Jenkins pytest在哪
        # pytest.exe 应该是在python下的scripts文件夹里
        pytest # Jenkins知道了pytest在哪以后,才能执行pytest的命令
J_构建
时程表的格式如下:
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,
f5 表示一个星期中的第几天。program 表示要执行的程式。

构建后操作

    12.点击增加构建后操作步骤,选择Allure Report
    13.Path路径输入:生成的报告所在的文件夹名称
    ⚠️ 文件夹名称与pytest生成的报告所在的文件夹名称一致,要与pytest.ini中的一致
    14.点击保存
J_构建后

38.jenkins触发项目构建方式

手动触发构建

  • 所以以后流程就是在pycharm中写代码,然后提交到github,再去Jenkins去看报告就可以了
  • 点击立即构建

更新github代码

  • 触发器在定时任务到达时,会触发项目构建
  • 项目构建完成以后,如果github上的代码没有更新,是不会再去构建的


    手动构建

39.Jenkins邮件配置

发件人配置

1、测试发件人好不好使
    配置邮件系统用户:
        系统管理-系统设置-Jenkins Location
        系统管理员邮件地址:用户名@163.com(发送邮件用户,建议使用163邮箱)
    配置系统邮件:
        系统管理-系统设置-邮件通知
        不同平台的smtp服务器地址不一样,自己去百度一下就好了
        SMTP服务器:例 smtp.163.com
        用户默认邮件后缀:例如 @163.com
        高级-使用SMTP认证
        输入发送邮箱和密码 -点击“通过发送测试邮件测试配置”,输入一个可以收到邮件的邮箱地址,
可以是自己的,关键要在收到邮件后看发件人对不对
        这里输入的密码不是邮箱的密码,例如在163邮箱中,点设置-客户端授权密码-点开启-开启以
后你自己设置的是什么密码,这里就填什么密码

2、配置发件人
    配置(发送附件)邮件:
        系统管理-系统设置-Extended E-mail Notification
        SMTP server:例 smtp.163.com
        Default user E-mail suffix:例如 @163.com
        高级-Use SMTP Authentication - 输入发送邮件的邮箱和密码
        Default Content Type: HTML(text/html)
        Default Content(报告模版,使用以下html代码即可):
               <hr/>(本邮件是程序自动下发的,请勿回复!)<hr/>
                项目名称:$PROJECT_NAME<br/><hr/>
                构建编号:$BUILD_NUMBER<br/><hr/>
                git版本号:${GIT_REVISION}<br/><hr/>
                构建状态:$BUILD_STATUS<br/><hr/>
                触发原因:${CAUSE}<br/><hr/>
                目录:${ITEM_ROOTDIR}<br/><hr/>
                构建日志地址:<a href=" ">${BUILD_URL}console</a ><br/><hr/>
                构建地址:<a href="$BUILD_URL">$BUILD_URL</a ><br/><hr/>
                报告地址:<a href="${BUILD_URL}allure">${BUILD_URL}allure</a ><br/><hr/>
                失败数:${FAILED_TESTS}<br/><hr/>
                成功数:${FAILED_TESTS}<br/><hr/>
                变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>

收件人配置

    # 添加测试报告接收邮件列表
     点击你的项目名字 - 点击配置 - 构建后操作
    14.点击增加构建后操作步骤,选择Editable Email Notification 
    15.点击Advanced Setting…
    16.点击Triggers中的高级按钮
    17.Recipient List输入邮件接收列表,多个邮件逗号分隔
邮件列表

40.XPath精确查找

//*[@text='Android']

用于查找某个属性是否等于某个值,而非包含。

41.XPath多条件查找

//*[@text='Android' and index='0']

用于通过多个条件进行查找

文件管理器

  • 第一个
    • 打开文件管理器
    • 在sdcard新建一个zzz文件夹
    • 在sdcard新建一个aaa文件夹
    • 进入zzz文件夹
    • 在zzz中创建文件 1.txt-20.txt
    • 把zzz中的20个文件移动aaa中
    • 判断-aaa有20个文件目录
目录
- 项目名字
- pytest.ini
- scripts
- - test_file
- page
- - file_page
- base
- - xxxx
test_file.py - 自动化脚本
脚本中有11个函数

1. 第一个
2. 如果属性弹窗中名字内容和所在位置一致 那么通过
3-10. 出了属性之外的左下角菜单所有功能
11. test_fail
    assert 0
    
尽量写上allure的log
邮件模板,最上面加上自己的名字

邮箱:hitheima@163.com

小作业

元素定位和操作练习

  • 点击搜索按钮
  • 输入“无线”
  • 获取当前有几条记录?

滑动和拖拽时间练习

  • 想办法滑动到最后的“关于手机”
  • 点击进去
  • 看当前页面是不是有一个“5.1”的字符串

常用代码

前置代码

    from appium import webdriver
    # server 启动参数
    desired_caps = {}
    # 设备信息
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '5.1'
    desired_caps['deviceName'] = '192.168.56.101:5555'
    # app的信息
    desired_caps['appPackage'] = 'com.android.settings'
    desired_caps['appActivity'] = '.Settings'
    # 解决输入中文
    desired_caps['unicodeKeyboard'] = True
    desired_caps['resetKeyboard'] = True

    # 声明我们的driver对象
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

获取包名

1.Mac/Linux: 'adb shell dumpsys window windows | grep mFocusedApp’
2.在 Windows 终端运行 'adb shell dumpsys window windows’ 然后去看mFocusedApp这一行的内容。

xPath

//*[contains(@,'')]

capabilities启动参数列表

通用
android
ios

keyevent常用键列表

  • 常用键展示
    KEYCODE_CALL 拨号键 5
    KEYCODE_ENDCALL 挂机键 6
    KEYCODE_HOME 按键Home 3
    KEYCODE_MENU 菜单键 82
    KEYCODE_BACK 返回键 4
    KEYCODE_SEARCH 搜索键 84
    KEYCODE_CAMERA 拍照键 27
    KEYCODE_FOCUS 拍照对焦键 80
    KEYCODE_POWER 电源键 26
    KEYCODE_NOTIFICATION 通知键 83
    KEYCODE_MUTE 话筒静音键 91
    KEYCODE_VOLUME_MUTE 扬声器静音键 164
    KEYCODE_VOLUME_UP 音量增加键 24
    KEYCODE_VOLUME_DOWN 音量减小键 25
    KEYCODE_ENTER 回车键 66
    KEYCODE_ESCAPE ESC键 111
    KEYCODE_DPAD_CENTER 导航键 确定键 23
    KEYCODE_DPAD_UP 导航键 向上 19
    KEYCODE_DPAD_DOWN 导航键 向下 20
    KEYCODE_DPAD_LEFT 导航键 向左 21
    KEYCODE_DPAD_RIGHT 导航键 向右 22
    KEYCODE_MOVE_HOME 光标移动到开始键 122
    KEYCODE_MOVE_END 光标移动到末尾键 123
    KEYCODE_PAGE_UP 向上翻页键 92
    KEYCODE_PAGE_DOWN 向下翻页键 93
    KEYCODE_DEL 退格键 67
    KEYCODE_FORWARD_DEL 删除键 112
    KEYCODE_INSERT 插入键 124
    KEYCODE_TAB Tab键 61
    KEYCODE_NUM_LOCK 小键盘锁 143
    KEYCODE_CAPS_LOCK 大写锁定键 115
    KEYCODE_BREAK Break/Pause键 121
    KEYCODE_SCROLL_LOCK 滚动锁定键 116
    KEYCODE_ZOOM_IN 放大键 168
    KEYCODE_ZOOM_OUT 缩小键 169
    KEYCODE_ALT_LEFT Alt+Left
    KEYCODE_ALT_RIGHT Alt+Right
    KEYCODE_CTRL_LEFT Control+Left
    KEYCODE_CTRL_RIGHT Control+Right
    KEYCODE_SHIFT_LEFT Shift+Left
    KEYCODE_SHIFT_RIGHT Shift+Right

  • 官方keyevent文档
    地址: https://developer.android.com/reference/android/view/KeyEvent.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335