jenkins+ant+jmeter测试报告+发邮件

转自https://www.bbsmax.com/A/xl56OPM9dr/

Jenkins+Jmeter持续集成笔记(一:环境准备)
整体思路:

通过Jmeter图形界面编写api测试脚本

ant 批量执行Jmeter脚本文件

将其集成到jenkins,设置执行频率与发送测试报告

运行环境

系统 配置 IP
Centos7.1 1核2G+60GB硬盘 10.10.28.205
1、安装JDK
(1)下载jdk并上传到/usr/java目录
选择对应的linux版本下载文件,我下载的是jdk-8u151-linux-x64.rpm。(上传java目录不存在时提前创建)

(2)解压安装

# rpm -ivh jdk-8u151-linux-x64.rpm

(3)新建java环境变量

# vim /etc/profile

在文件末尾添加如下内容

image.png

使添加的内容生效

# source /etc/profile 

(4)检查是否安装成功

# java -version
image.png

2、安装Jmeter
(1)下载jmeter并上传到/usr/jmeter目录
选择对应的linux版本下载文件,我下载的是apache-jmeter-3.3.tgz。(上传jmeter目录不存在时提前创建)

(2)解压完成后,添加环境变量

# vim /etc/profile

在文件末尾添加如下内容

export JMETER=/usr/jmeter/apache-jmeter-3.3
export CLASSPATH=JMETER/lib/ext/ApacheJMeter_core.jar:JMETER/lib/jorphan.jar:JMETER/lib/logkit-2.0.jar:CLASSPATH
export PATH=JMETER/bin/:PATH

使添加的内容生效

# source /etc/profile 

(3)检查是否安装成功

# jemter -v
image.png

3、安装Jenkins
(1)下载jenkins并上传到/usr/jenkins目录
选择对应的linux版本下载文件,我下载的是jenkins-2.73.3-1.1.noarch.rpm。(上传jenkins目录不存在时提前创建)

(2)解压

image.png

(3)设置jenkins自启动,并启动jenkns

# chkconfig jenkins on
# service jenkins start

jenkins默认端口是8080,如果端口已被别的程序占用,可在jenkins配置文件/etc/sysconfig/jenkins中修改jenkins端口号


image.png

(4)访问jenkins主页

http://10.10.28.205:8080/
image.png

根据页面提示找到文件中的字符串,填入Administrator password一栏,解锁jenkins。

然后勾选安装全部插件,接着设置登录账号密码。

小提示:

jenkins的war包路径(/usr/lib/jenkins/jenkins.war)
jenkins程序文件路径(/var/lib/jenkins)

环境安装就到这里,接下来准备使用ant来执行jmeter脚本文件

Jenkins+Jmeter持续集成笔记(二:ANT执行Jmeter脚本)

Jmeter接口测试脚本运行后生成的是jtl(xml)格式的文件,这些文件不具备可读性,所以我们要把他转化为可以阅读的html格式报告。

Ant是一个功能强大的打包编译工具。我们使用他的目的是将xml文件转化为html格式的文件。

1、安装ANT

(1)下载ANT安装包到/usr/ant目录

wget https://mirrors.cnnic.cn/apache/ant/binaries/apache-ant-1.9.9-bin.tar.gz

(上传ant目录不存在时提前创建)

(2)解压安装

-bin.tar.gz

(3)新建ant环境变量

# vim /etc/profile

在文件末尾添加如下内容

export ANT_HOME=/usr/ant/apache-ant-1.9.9
export PATH=PATH:JAVA_HOME/bin:$ANT_HOME/bin

使添加的内容生效

 # source /etc/profile 

(4)检查是否安装成功

# ant -version

image

重要配置:

1)将 jmeter的extras目录中ant-jmeter-1.1.1.jar包拷贝至ant安装目录下的lib目录中

这一步操作使Ant运行时能够找到"org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"这个类,从而成功触发JMeter脚本

2)修改Jmeter的bin目录下jmeter.properties文件的配置:jmeter.save.saveservice.output_format=xml

这一步操作使Jmeter报告输出文件格式为xml

image

2、准备Jmeter测试脚本

请参见我关于jmeter脚本编写的其他文章 http://www.cnblogs.com/LiangHu/tag/Jmeter/

我的测试脚本如下图所示:test_token.jmx

image

3、用Ant执行脚本

(1)在jmeter安装目录下新建两个文件夹

TestReport文件夹:用于保存html的结果报告;

TestScrip文件夹:用于保存jmeter的测试脚本。

image

(2)ant执行jmeter脚本原理

ant工具主要是根据build.xml文件来进行工作的,官方给出的默认文件在Jmeter的安装目录下extras文件夹中。

你可以在该目录下直接输入命令ant看一下效果:

image

构建时,ant执行的是该目录下Test.jmx脚本,执行完毕后把输出的报告Test.jtl文件转化为Test.html文件

image

从图上可以看出生成了这两个测试报告文件。希望可以从这个过程中能够大概了解ant执行jmeter脚本的原理。

测试报告使用默认的样式,如下图所示:

image

(3)修改build.xml文件

<?xml version="1.0" encoding="UTF-8"?>
 
 <project name="ant-jmeter-test" default="run" basedir=".">
     <tstamp>
         <format property="time" pattern="yyyyMMddHHmm" />
     </tstamp>
     <!-- 需要改成自己本地的 Jmeter 目录-->
     <property name="jmeter.home" value="/usr/jmeter/apache-jmeter-3.3" />
     <!-- jmeter生成jtl格式的结果报告的路径-->
     <property name="jmeter.result.jtl.dir" value="/usr/jmeter/apache-jmeter-3.3/TestReport/testToken/jtl" />
     <!-- jmeter生成html格式的结果报告的路径-->
     <property name="jmeter.result.html.dir" value="/usr/jmeter/apache-jmeter-3.3/TestReport/testToken/html" />
     <!-- 生成的报告的前缀-->
     <property name="ReportName" value="TestReport" />
     <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
     <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />
     <!-- 输出生成的报告名称和存放路径-->
     <echo message="${jmeter.result.jtlName}"/>
     <echo message="${jmeter.result.htmlName}"/>
     <echo message="${jmeter.result.html.dir}"/>
 
     <target name="run">
         <antcall target="test"/>
         <antcall target="report"/>
     </target>
 
     <!--加载jar包,解决显示时间问题-->
     <path id="xslt.classpath">
         <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
         <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
     </path> 
 
     <target name="test">
         <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
         <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
             <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
             <testplans dir="/usr/jmeter/apache-jmeter-3.3/TestScrip" includes="test_token.jmx" />
 
             <property name="jmeter.save.saveservice.output_format" value="xml"/>
         </jmeter>
     </target>
 
     <target name="report">
     <tstamp> <format property="report.datestamp" pattern="yyyy-MM-dd HH:mm" /></tstamp>
         <xslt
               classpathref="xslt.classpath"
               force="true" 
 
               in="${jmeter.result.jtlName}"
               out="${jmeter.result.htmlName}"
               style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl">
               <!--显示dateReport的时间-->
               <param name="dateReport" expression="${report.datestamp}"/>
         </xslt>
         <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
         <copy todir="${jmeter.result.html.dir}">
             <fileset dir="${jmeter.home}/extras">
                 <include name="collapse.png" />
                 <include name="expand.png" />
             </fileset>
         </copy>
     </target>
 </project>

说明:

文件中style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl"指的是测试报告采用的样式。读者可以在jmeter安装目录下extras文件夹里看到前缀类似jmeter-results-report的文件,不妨挨个替换进style的值,执行完测试脚本后看一下输出的测试报告样式。

jmeter.results.shanhe.me.xsl该样式是我从网上下载的,默认的报告样式展示的信息比较少不适合我的项目而已,下载好上传到extras文件夹即可。

(这个build.xml文件基本可以作为模板使用,只要你按照自己当前的环境改一下文件中少量配置即可。)

(4)上传测试脚本test_token.jmx和build.xml文件到TestScrip目录下

image

(5)ant命令执行测试脚本

进入TestScrip目录,输入:ant run(run为build.xml中的target的name名)

image

(6)查看测试报告

根据bulid.xml文件中定义的测试报告路径,进入相应目录即可找到测试报告文件。

<!-- jmeter生成html格式的结果报告的路径-->
  <property name="jmeter.result.html.dir" value="/usr/jmeter/apache-jmeter-3.3/TestReport/testToken/html" />
image

在这里可以看到报告中的request和response两项没有数据。修改jmeter/bin目录下jmeter.properties文件如下部分,我这里都修改成true,这样执行完脚本后就会保存这些结果到.jtl文件里面:

jmeter.save.saveservice.data_type=true
jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
jmeter.save.saveservice.response_data=true
# Save ResponseData for failed samples
jmeter.save.saveservice.response_data.on_error=false
jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.encoding=false
jmeter.save.saveservice.bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.save.saveservice.idle_time=true
image

接下来将介绍如何把以上的操作使用jenkins来做持续集成
上一篇笔记中已经实现了通过ant工具执行Jmeter测试脚本,并输出html格式测试报告到指定目录。

在本章中,将尝试把这个过程丢进jenkins去执行。

1、Jenkins全局工具配置

登录jenkins->系统管理->Global Tool Configuration

(1)JDK配置

image

(2)Ant配置

image

配置信息按照机器上实际安装的来填写。页面上的其他工具配置与我的测试工作无关,不用关注。

2、Jenkins新建任务

登录jenkins->首页的“新建”功能按钮

(1)构建一个自由风格的软件项目

image

(2)配置“构建”步骤

构建->增加构建步骤->Invoke Ant

image

Ant Version:jenkins全局工具配置过Ant后,点击表单会出现在下拉框中,直接选中即可;

Targets:前一章中提到的build.xml文件中的targets的名字;

Build File:指定build.xml文件的路径以及文件名,可以看到我在这里把build.xml重命名为test_token_build.xml,目的是如果以后jenkins集成的测试脚本数量变多以后,能够确保build.xml文件与测试脚本一一对应。

3、配置完毕,开始测试

(1)立即构建

image

(2)查看控制台输出

image

由图看出,以及执行到了测试脚本,但是由于权限不够,导致本次构建失败。

给jmeter.log授予权限即可:

image

在该目录下授权

#  jmeter.log

授权后:

image

OK,再次构建查看结果:

image

(3)查看测试报告是否生成

查看路径:/usr/jmeter/apache-jmeter-3.3/TestReport/testToken

本章节就到此为止,我们实现了通过jenkins页面直接点击测试项目的“立即构建”功能按钮,就能够在远程服务器上自动的执行测试输出测试报告。下一章节会通过配置jenkins,来实现测试任务的定时执行以及测试报告通过邮箱自动发送出来的功能。

通过前几篇文章,jmeter+ant+jenkins自动化持续构建的测试平台基本成型。既然要自动化平台,最基本的肯定要实现不经过人工干预,平台会在特定的条件下自动运行测试脚本,并在脚本运行结束后,发送邮件通知用户测试的结果。本文主要介绍如何实现以上两项功能。

还是接着以上一篇笔记中的“test_token”项目为例:

1、构建触发器

image

构建触发器可以根据自己的需求选择,由图看到有四种类型:

(1)可使用脚本触发远程构建;

(2)其他job构建完成后触发当前job执行构建;

(3)定时周期性构建;

(4)hookplugin检测到源码的push操作就触发构建;

(5)定时检查代码分支是否有变化,如果有变化则执行一次构建。

我的目的是做接口测试自动化,每天定时跑任务并监控API功能是否正常,所以选择Build periodically(定期构建)。日程表一共五个参数:

从左到右分别代表:分 时 天 月 星期

第一个参数代表的是分钟minute,取值0~59;

第二个参数代表的是小时hour,取值0~23;

第三个参数代表的是天day,取值1~31;

第四个参数代表的是月month,取值1~12;

第五个参数代表的是星期week,取值0~7,0和7都代表星期天。

0 7 * * 1,3,5 表示每周一、周三、周五的7点00分执行一次,*代表所有。

2、邮件通知

(1)Jenkins Location配置

jenkins首页->系统管理->系统配置页面

其中Jenkins URL有默认值,最好修改,因为默认地址不安全。

系统管理员邮件地址一定要写,因为这个地址是邮件通知的发信人邮箱,填写方式有两种:

a)直接填写邮箱地址

b)可以加前缀来标识该邮件基本信息,例如:自动化测试邮件<邮箱地址>

image

(2)Extended E-mail Notification配置

jenkins首页->系统管理->系统配置页面

按照自己实际使用的邮箱进行配置,设置时,点击“高级”展开,使用SMTP认证(Use SMTP Authentication):

根据邮箱服务提供商确定SMTP服务器,如:126的SMTP是smtp.126.com、163的SMTP是smtp.163.com

根据邮箱服务提供商确定是否使用SMTP认证、是否使用SSL协议以及SMTP端口

根据邮箱服务提供商确定“Password”是邮箱的登录密码还是专用于第三方工具发邮件的验证码,如:QQ和163为验证码,126为登录密码

image

OK,邮箱服务的基本配置已经完成。

接下来的配置相当于是邮件通知的全局配置,对具体job来说,还会进行具体的配置,如果在job中重新配置了这里相同的项目,就会覆盖这里的全局配置。

image

1)Default Content Type:“text/plain”指邮件正文为纯文本格式,“text/html”指邮件内容可以包含html标签且能被邮箱客户端正确解析、显示。我这里选择“text/html”。

2)Default Subject:邮件标题,可以使用系统中的全局邮件变量来设置。我这里设置的标题格式为:项目名称-BUILD#构建次数-构建状态。

3)勾选“Enable Debug Mode”,以开启Extended E-mail Notification的调试功能,这样可以在构建日志中增加更多与Extended E-mail Notification相关的日志。

(3)Job中的邮件配置

jenkins首页->job"test_token”->配置->构建后操作

在job中配置页面,选择增加构建后操作,选中Editable Email Notification即可。

image

需要填写的各配置项参数说明:

1)Project Recipient List:这是一个以逗号(或者空格)分隔的收件人邮件的邮箱地址列表。

2)Default Content:邮件内容,可以使用构建中的环境变量,使得邮件中展示你想要的信息。

完整内容如下:

<!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
 </head>
 
 <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
 offset="0">
 <table width="95%" cellpadding="0" cellspacing="0"
     style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
     <tr>
         <td>(本邮件是程序自动下发的,请勿回复!)</td>
     </tr>
     <tr>
         <td><h2>
                 <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
             </h2></td>
     </tr>
     <tr>
         <td><br />
         <b><font color="#0B610B">构建信息</font></b>
         <hr size="2" width="100%" align="center" /></td>
     </tr>
     <tr>
         <td>
             <ul>
                 <li>项目名称 : ${PROJECT_NAME}</li>
                 <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
                 <li>触发原因 : ${CAUSE}</li>
                 <li>构建日志 : 请查看附件</li>
         <li>测试报告 : 请查看附件</li>
                 <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
             </ul>
         </td>
     </tr>
     <tr>
         <td><b><font color="#0B610B">Changes Since Last
                     Successful Build:</font></b>
         <hr size="2" width="100%" align="center" /></td>
     </tr>
     <tr>
         <td>
             <ul>
                 <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
             </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}
         </td>
     </tr>
 
 </table>
 </body>
 
 </html>

3)Attachments:邮件的附件,我把执行测试脚本生成的html测试报告文件,作为附件随邮件发出去。

注意:这里的写法可以使用通配符来确定文件的路径名称等,但是文件一定要位于workspace目录里面。

由于我之前的job把测试报告放置在/usr/jmeter/apache-jmeter-3.3/TestReport/testToken/html路径下,所以现在要修改一下测试报告输出的路径:

首先确认workspace目录的路径:/var/lib/jenkins/workspace;

接着在workspace目录下创建存放测试报告的新文件夹:

/var/lib/jenkins/workspace/test_token/html

/var/lib/jenkins/workspace/test_token/jtl

最后修改/usr/jmeter/apache-jmeter-3.3/TestScrip目录中的test_token_build.xml文件,把其中测试报告的输出路径修改为新的路径即可。

该参数文本框填写内容为html/*.html,意为在该job的workspace路径下搜索html文件夹中所有以.html为后缀的文件,并把这些文件添加到邮件附件中。

(4)触发器配置

决定什么情况下发送邮件。我配置为Always总是触发,接着send to选择RecipientList,意思是每次构建无论成功与否都发送邮件到上面指定的收件人列表邮箱。
image

3、测试配置是否成功

构建触发器的日程表填一个马上临近的时间,等待任务自动执行并发送邮件。

邮件结果为:

image

本章已经把定时任务和邮件通知功能实现了,下一章将会对该平台进行些优化。

通过前面的一系列文章,我的API自动化测试平台已经搭建成型,但是要投入具体项目使用时,还有以下几个问题需要优化。

还是接着以上一篇笔记中的“test_token”项目为例:

1、邮件通知问题

(1)问题

这里的主要问题是针对邮件中的附件(即测试报告),在前一篇配置邮件通知的文章,我对于附件的配置是这么说的:

image

如果你能够多触发几次构建就会发现问题,随着构建次数越来越多,产生的测试报告也越来越多,即.html文件会越来越多,而每次构建的邮件通知都会把所有的.html文件添加到附件,这样用户收到的自动化测试邮件里面,不仅能看到本次构建的测试报告,还可以看到之前所有构建的测试报告,体验非常不好。

(2)解决思路

在每次构建前删除掉上次构建产生的测试报告文件,使得添加附件时,只能在html文件夹中搜索到本次构建的测试报告。

(3)解决方案

方案一:

job->配置->构建->增加构建步骤

在Invoke Ant构建前,我们添加一个构建步骤“Execute shell”

image

增加了一个新的构建步骤,在构建ant任务之前,先在服务器上执行一段shell,功能是删除测试报告文件夹下所有的测试报告文件即可。shell脚本如下:

rm -f /var/lib/jenkins/workspace/test_token/html/*.html
rm -f /var/lib/jenkins/workspace/test_token/jtl/*.jtl

看一下构建日志发现shell脚本被成功执行:

image

方案二

job->配置->构建环境->Delete workspace before build starts

image

构建环境我勾选了"Delete workspace before build starts",在具体解释这一步配置之前,我先说一下workspace在目前这个平台中起到什么作用:

首先,我们在jenkins每创建一个新的job,系统就会在jenkins的安装目录下的workspace文件夹下创建一个以job name命名的文件夹;

接着,由于邮件通知添加附件的问题,我们手动把测试报告的输出位置移动到这个job name命名的文件夹下面,也就是经常提到的html文件夹的位置;

希望下面两张图能够加深对他的理解:

image

图一:workspace的目录树结构

image

图二:test_token项目下的工作空间目录

我们可以使用ANT语法指定一种模式来筛选出要被删除的文件:

(1)下拉选择框有两种模式Include和Exclude

Include模式:如果文件匹配语法要求删选条件,则文件会被移除

Exclude模式:如果文件匹配语法要求删选条件,则文件不会被移除

(2)规则只适用于文件,如果你想要适用于文件夹,请勾选Apply pattern also on directories参数

我这里填写的规则意思是,在workspace目录下的本项目中,筛选出所有以.html为后缀的文件并移除他们。

关于这个功能的配置大家还可以参考官方文档的原文https://wiki.jenkins.io/display/JENKINS/Workspace+Cleanup+Plugin

接下来看一下构建日志检查构建环境是否执行:

image

OK,以上两种方法都可以解决邮件通知附件的问题,大家可根据实际需要进行选择。

2、丢弃旧的构建

每次构建都会保存数据,所以需要定期的清除过期文件,这时就用到了“丢弃旧的构建”这个功能。

保持构建的天数:每个构建能保留多少天

保持构建的最大个数:最多保留多少个构建

image

好了,优化部分就到此为止。

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