2015年10月8日星期四

集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce - Rector

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统�CVirto Commerce - Rector  阅读原文»

今天一大早来看到园友分享的福利《分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi》,我也来分享一个吧。以下内容由笔者写于昨天晚上[2015.10.08]。

《集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce》–看着这个标题有点长了,笔者本想试着用这个标题来大体概括一下这个[Virto Commerce]基于.NET(C#)的开源电商系统的,但很显然是办不到的。因为无论从Virto Commerce的解决方案架构,还是从Virto Commerce所涉及的各种技术概念来说,用无法一个标题来概括。那么,对于初识Virto Commerce来说,它到底是什么呢,其中运用了哪些牛X的技术和解决方案呢?让我们从Virto Commerce的官方简介说起。

Virto Commerce是在基于许多个成功的实际生产经验之上于2011年创建的电子商务系统框架,如今这个框架被许多企业所运用。对于中小企业来说,你可以免 费使用Virto Commerce的社区版,并自由地完成二次开发与扩展。作为一个完整的电商系统,Virto Commerce包含了前端的购买商城系统和后端的管理系统。后端的管理界面如下图:

image02

Virto Commerce使用到的技术包含如下图:

image04

具体的技术如:

  • ASP.NET MVC 5
  • ASP.NET Web API 2
  • Entity Framework 6.1
  • EF Migrations
  • ASP.NET Identity
  • Signalr
  • Angularjs

Virto Commerce的架构使用了DDD,TDD以及SOLID等作为底层的技术,作为表现层则使用了MVVM的模式,具体的架构图如下:

Arhitecture overview2

Virto Commerce是基于模块开发的,这样对于开发者来说实现扩展是非常容易和方便的,而且模块是热插拔的。如下图的官方已实现的模块:

image03

此外,Virto Commerce还集成了强大的搜索组件ElasticSearch来实现前后台的搜索功能,集成了定时任务组件Hangfire来完成各种定时任务的调度和执行等。

最后,由于Virto Commerce后台管理系统界面(UI)是基于Angularjs实现的,所以用户体验是相当的流畅的,如果读者使用过Azure的管理系统,在体验上 就是如此(虽然目前的细节方面还不能和Azure的Portal相比^_^)。看一下Azure的Portal:

portal-01

好了,介绍了这么多关于Virto Commerce电子商城系统的相关情况。

如果需要体验的话,请至官方演示地址:http://virtocommerce.com/try-now;

如果要查看下载官方源码,请至:https://github.com/VirtoCommerce/vc-community

如果需要查看官方的介绍及文档,请至:http://docs.virtocommerce.com/display/vc2devguide/Introduction

如果你对本文介绍的新鲜的.NET开源框架系统还不错的话,那请你点点“推荐”,让更多人也了解它吧


本文链接:集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统�CVirto Commerce,转载请注明。

基于WebDriver&TestNG 实现自己的Annotation @TakeScreenshotOnFailure - WadeXu  阅读原文»

相信用过Selenium WebDriver 的朋友都应该知道如何使用WebDriver API实现Take Screenshot的功能。

在这篇文章里,我主要来介绍对failed tests实现 take screenshot的功能, 并且我们也高大上一回,做成注解的形式。

效果如下:

目录
前提
Maven 配置
Example
    简单类图
     TakeScreenshotOnFailure
CustomTestListener
WebDriverHost
TestBase
DemoListenerTest
TestNG.xml
Run as TestNG

前提

  • JDK 1.7
  • Maven 3

Maven 配置

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.5</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.46.0</version>
</dependency>

Example

简单类图

首先创建一个类 如下 TakeScreenshotOnFailure.java

package test.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Annotation informs CustomTestListener to take screenshot if test method fails. File name is method name + png suffix.
* Test class must implement WebDriverHost in order for the screenshot to work.
*
*
@author wadexu
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value
=
{ElementType.METHOD})
public @interface TakeScreenshotOnFailure {
}

##转载注明出处: http://www.cnblogs.com/wade-xu/p/4861024.html

然后创建一个自己的CustomTestListener 继承TestNG 的 TestListenerAdapter 重写onTestFailure()方法, 加入take screenshot的功能

代码如下

package test.demo;

import java.io.File;
import java.lang.reflect.Method;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;

import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

/**
*
* @Description: A custom test listener extends TestListenerAdapter for take screen shot on failed test case.
*
@author wadexu
*
* @updateUser
* @updateDate
*/
public class CustomTestListener extends TestListenerAdapter {

private static String fileSeperator = System.getProperty("file.separator");
protected static final Logger logger = Logger.getLogger(CustomTestListener.class);

@Override
public void onTestFailure(ITestResult result) {
super.onTestFailure(result);
Object o
= result.getInstance();
WebDriver driver
= ((WebDriverHost) o).getWebDriver();

Method method
= result.getMethod().getConstructorOrMethod().getMethod();
TakeScreenshotOnFailure tsc
= method.getAnnotation(TakeScreenshotOnFailure.class);

if (tsc != null) {
String testClassName
= getTestClassName(result.getInstance().toString()).trim();

String testMethodName
= result.getName().toString().trim();
String screenShotName
= testMethodName + ".png";

if (driver != null) {
String imagePath
=
".." + fileSeperator + "Screenshots" + fileSeperator + "Results"
+ fileSeperator + testClassName + fileSeperator
+ takeScreenShot(driver, screenShotName, testClassName);
logger.info(
"Screenshot can be found : " + imagePath);
}
}
}

/**
* Get screen shot as a file and copy to a new target file
*
* @Title: takeScreenShot
*
@param driver
*
@param screenShotName
*
@param testClassName
*
@return screenShotName
*/
public static String takeScreenShot(WebDriver driver,
String screenShotName, String testClassName) {
try {
File file
= new File("Screenshots" + fileSeperator + "Results");
if (!file.exists()) {
logger.info(
"File created " + file);
file.mkdir();
}

File screenshotFile
= ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
File targetFile
= new File("Screenshots" + fileSeperator + "Results" + fileSeperator + testClassName, screenShotName);
FileUtils.copyFile(screenshotFile, targetFile);

阅读更多内容

没有评论:

发表评论